【发布时间】:2011-10-31 11:43:55
【问题描述】:
我试图模仿 Sieve 使用 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 分钟。在我写这个问题的时候,Sieve 30 还没有完成。
谁能解释为什么这个递归函数这么慢。感谢您的任何帮助,您可以提供。
【问题讨论】:
-
作为 Haskell 中 Eratosthenes 筛子的最终权威,您应该看看 Melissa O'Neill 在函数式编程杂志 (2009) 上的文章 (lambda-the-ultimate.org/node/3127)。里面应该还有一些技巧。
标签: haskell