【发布时间】:2011-05-22 02:52:34
【问题描述】:
我有两个程序来查找素数(只是一个练习,我正在学习 Haskell)。一旦使用 ghc(带有标志 -O)编译,“primes”比“primes2”快大约 10 倍。但是,在“primes2”中,我认为它只会考虑除数测试的素数,这应该比“isPrime”中考虑奇数更快,对吧?我错过了什么?
isqrt :: Integral a => a -> a
isqrt = floor . sqrt . fromIntegral
isPrime :: Integral a => a -> Bool
isPrime n = length [i | i <- [1,3..(isqrt n)], mod n i == 0] == 1
primes :: Integral a => a -> [a]
primes n = [2,3,5,7,11,13] ++ (filter (isPrime) [15,17..n])
primes2 :: Integral a => a -> [a]
primes2 n = 2 : [i | i <- [3,5..n], all ((/= 0) . mod i) (primes2 (isqrt i))]
【问题讨论】:
-
我不是 100% 确定,但我认为问题在于
primes2中没有共享;每次您拨打primes2 (isqrt i)时,您都会重新生成整个列表。 -
有趣。没有素数2的记忆? (PS:我不确定我是否理解 memoization,请耐心等待)
标签: performance list haskell