【发布时间】:2021-09-26 01:04:16
【问题描述】:
我有一个预定义的函数“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' 返回无限列表!这意味着 prime_factor 将继续在无限列表中搜索,对吧?
-
prime_factors n = [x | x <- primes, n `mod` x == 0]与filter (\ x -> mod n x == 0) primes相同,并且正如您所说,由于primes是一个 infinite 列表,因此过滤器会无限期地运行,即无限长的时间。这就是为什么。至于如何,你可以用takeWhile:prime_factors n = [x | x <- takeWhile (<= n) primes, n `mod` x == 0]来解决这个问题。 (在问题结束后在 cmets 中回答)。
标签: haskell output primes freeze prime-factoring