Próbuję naśladować Sieve, aby znaleźć wszystkie najlepsze mniej niż niektóre liczby przy użyciu Haskell. Znalazłem inny program Haskell, który używa metody Sieve z wielką szybkością. Jednak następująca funkcja rekursywna, którą napisałem, jest bardzo powolna. Kod jest następujący:Dlaczego ta funkcja rekurencyjna w Haskell jest taka powolna?
sieve' :: Integer -> Integer -> [Integer]
sieve' n 1 = [2 .. n]
sieve' n (k + 1) | [x | x <- sieve' n k, x == k + 1] == [] = sieve' n k
|otherwise = [x | x <- sieve' n k, x == k + 1 || not (mod x (k + 1) == 0)]
sieve :: Integer -> [Integer]
sieve n = sieve' n n
Sito 20 trwa około 2 minuty. Sieve 30 wciąż się nie zakończyła, pisząc to pytanie.
Czy ktoś może wyjaśnić, dlaczego ta funkcja rekursywna jest tak powolna. Dziękuję za pomoc, którą możesz udzielić.
Jako najwyższy autorytet na sicie Eratostenesa w Haskell, powinieneś rzucić okiem na artykuł Melissy O'Neill (http://lambda-the-ultimate.org/node/3127) w Journal of Functional Programming (2009). Powinno być w nim jeszcze kilka sztuczek. – ShiDoiSi