- 论坛徽章:
- 95
|
Sieve of Eratosthenes 算法描述见 http://en.wikipedia.org/wiki/Sieve_of_Eratosthenes
Haskell 实现如下:
- sieve :: [Integer] -> [Integer]
- sieve (x:xs) = x : sieve xs'
- where xs' = filter (\y -> y `mod` x /= 0) xs
- primes = 2 : sieve [3,5..]
复制代码
加了平方优化后的版本
- sieve :: [Integer] -> [Integer]
- sieve (x:xs) = x : sieve (xs' ++ xs''')
- where
- (xs', xs'') = break (>= x*x) xs
- xs''' = filter (\y -> y `mod` x /= 0) xs''
- primes = 2 : sieve [3,5..]
复制代码
实际上,第二个版本有严重的性能问题(break 会导致大量的内存操作)以至于还没有第一个快。
真正优化的版本(by win_hate):
- isPrime :: Integer -> [Integer] -> Bool
- isPrime p (x:xs)
- | x*x > p = True
- | p `mod` x == 0 = False
- | otherwise = isPrime p xs
- primes = 2 : [ p | p <- [3,5..], isPrime p primes ]
复制代码
BTW,这个还可以再稍加优化。
[ 本帖最后由 MMMIX 于 2009-5-20 14:15 编辑 ] |
|