isqrt :: Integer -> Integer
isqrt = floor . sqrt . fromIntegral
primes :: [Integer]
primes = sieve [2..] where
sieve (p:ps) = p : sieve [x | x <- ps, x `mod` p > 0]
primeFactors :: Integer -> [Integer]
primeFactors n = takeWhile (< n) [x | x <- primes, n `mod` x == 0]
这是我的代码。我想你猜到了我想要做什么:使用无限质数列表的给定数字的质因数列表。但是这段代码不会懒惰地评估。
当我使用
ghci
和 :l mycode.hs
然后输入 primeFactors 24
,结果是 [2, 3
(并且光标在那里不断闪烁)没有进一步的 Prelude>
迅速的。我认为那里有问题。我究竟做错了什么?谢谢。
最佳答案
takeWhile
永远不会因复合参数而终止。如 n
是合数,它没有质因数 >= n
, 所以 takeWhile
只会坐在那里。
申请 takeWhile
到素数列表,然后用 n mod
过滤结果x,像这样:
primeFactors n = [x | x <- takeWhile (<= n) primes, n `mod` x == 0]
(
<=
用于代替 <
以获得最大的正确性,以便质数的质因数由该数字组成)。
关于Haskell 不评估 Lazily takeWhile,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38827147/