我试图用Haskell模仿筛法来找出所有小于某个数字的质数。我发现其他使用筛法方法的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
Sieve 20大约需要2分钟。当我写这个问题时,Sieve 30还没有完成。
有人能解释一下为什么这个递归函数如此缓慢吗?感谢您提供的任何帮助。