Berikut ini adalah masalah pemrograman sederhana dari SPOJ: http://www.spoj.com/problems/PROBTRES/ .
Pada dasarnya, Anda diminta untuk menampilkan siklus Collatz terbesar untuk angka antara i dan j. (Siklus collatz dari sejumlah $ n $ adalah jumlah langkah untuk akhirnya mendapatkan dari $ n $ ke 1.)
Saya telah mencari cara Haskell untuk memecahkan masalah dengan kinerja komparatif daripada Java atau C ++ (sehingga sesuai dengan batas run-time yang diizinkan). Meskipun solusi Java sederhana yang memoise panjang siklus dari setiap siklus yang sudah dihitung akan berhasil, saya belum berhasil menerapkan ide untuk mendapatkan solusi Haskell.
Saya telah mencoba Data.Function.Memoize, serta teknik memoisasi waktu log buatan sendiri menggunakan ide dari pos ini: /programming/3208258/memoization-in-haskell . Sayangnya, memoisasi justru membuat perhitungan siklus (n) lebih lambat. Saya percaya perlambatan datang dari overhead cara Haskell. (Saya mencoba menjalankan dengan kode biner yang dikompilasi, bukannya menafsirkan.)
Saya juga menduga bahwa hanya iterasi angka dari i ke j dapat mahal ($ i, j \ le10 ^ 6 $). Jadi saya bahkan mencoba precompute semuanya untuk kueri rentang, menggunakan ide dari http://blog.openendings.net/2013/10/range-trees-and-profiling-in-haskell.html . Namun, ini masih memberikan kesalahan "Batas Waktu Melebihi".
Bisakah Anda membantu menginformasikan program Haskell yang kompetitif dan rapi untuk ini?