我正在試圖模擬使用Haskell找到所有素數小於某個數的篩。我發現其他Haskell程序以極快的速度使用Sieve方法。然而,我寫的下面的遞歸函數非常慢。代碼如下爲什麼Haskell中的這個遞歸函數很慢?
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
篩20需要約2分鐘。在我寫這個問題時篩30仍未完成。
任何人都可以解釋爲什麼這個遞歸函數是如此之慢。感謝您的任何幫助,您可以提供。
作爲Eratosthenes在Haskell中篩選的最終權威,您應該閱讀功能規劃期刊(2009)中的Melissa O'Neill的文章(http://lambda-the-ultimate.org/node/3127)。應該有更多的技巧。 – ShiDoiSi