İşte SPOJ'dan basit bir programlama problemi: http://www.spoj.com/problems/PROBTRES/ .
Temel olarak, i ve j arasındaki sayılar için en büyük Collatz döngüsünü çıkarmanız istenir. ($ N $ sayısının Collatz döngüsü, sonunda $ n $ 'dan 1' e kadar adımların atılmasıdır.)
Ben Java veya C ++ (izin verilen çalışma zamanı sınırına sığacak şekilde) daha karşılaştırmalı performans ile sorunu çözmek için bir Haskell yolu arıyordum. Zaten hesaplanmış döngülerin döngü uzunluğunu hatırlayan basit bir Java çözümü işe yarayacak olsa da, bir Haskell çözümü elde etme fikrini uygulamada başarılı olamadım.
Bu yazıdan fikri kullanarak Data.Function.Memoize yanı sıra evde demlenmiş günlük zaman memoization tekniği denedim: /programming/3208258/memoization-in-haskell . Ne yazık ki, notlaşma aslında (n) döngüsünün hesaplanmasını daha da yavaşlatır. Yavaşlamanın Haskell yolunun tepesinden geldiğine inanıyorum. (Ben yorumlamak yerine, derlenmiş ikili kod ile çalışmayı denedim.)
Ayrıca, i'den j'ye kadar olan sayıları yinelemenin maliyetli olabileceğinden şüpheleniyorum ($ i, j \ le10 ^ 6 $). Bu yüzden, http://blog.openendings.net/2013/10/range-trees-and-profiling-in-haskell.html'deki fikri kullanarak aralık sorgusu için her şeyi önceden hesaplamaya çalıştım . Ancak bu yine de "Zaman Sınırı Aşılıyor" hatası veriyor.
Bunun için düzenli bir Haskell programını bilgilendirmeye yardımcı olabilir misiniz?