我有一个预定义的函数"primes
";它返回一个包含所有素数的无限列表。我为一个函数写了以下代码;prime_factors n
";返回n
的所有素数因子
prime_factors n = [x | x<-primes, n `mod` x == 0]
在执行prime_factors 12
时,它给了我正确的输出[2,3
,但在没有输出的情况下继续执行。为什么会发生这种情况,我怎样才能阻止它?
作为参考,下面是整个代码段:
primes :: [Integer]
primes = f [2..] where f (p:xs) = p: f [x | x <- xs, x mod p/=0] f [] = []
prime_factors n = [x | x<-primes, n mod x == 0, x*2 <= n]
primes :: Int -> [Integer]
primes n = take n $ f [2..]
where f (p:xs) = p: f [x | x <- xs, x `mod` p/=0]
prime_factors :: Int -> [Integer]
prime_factors n = [x | x<-primes n, n `mod` fromIntegral x == 0]
这不是一个漂亮的解决方案(我自己对Haskell相对较新),但它通过使用take
函数来阻止程序无限期运行,以确保您永远不会获得超过有限数量的条目,直到n
,根据定义,这将远远超过您需要的,因为在给定的阈值下,素数总是比自然数少,即length [2,3] < length [1,2,3]
等。
希望其他人能给你一个更优雅的解决方案。但是这个可以。