我正在试图模拟使用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