【问题标题】:Function for returning all prime factors of a number in Haskell [duplicate]在Haskell中返回一个数字的所有素数的函数[重复]
【发布时间】: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 &lt;- primes, n `mod` x == 0]filter (\ x -&gt; mod n x == 0) primes 相同,并且正如您所说,由于 primes 是一个 infinite 列表,因此过滤器会无限期地运行,即无限长的时间。这就是为什么。至于如何,你可以用takeWhile:prime_factors n = [x | x &lt;- takeWhile (&lt;= n) primes, n `mod` x == 0] 来解决这个问题。 (在问题结束后在 cmets 中回答)。

标签: haskell output primes freeze prime-factoring


【解决方案1】:
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 函数来阻止程序无限期运行,以确保您永远不会获得超过有限数量的条目,最多 @ 987654323@,根据定义,这将远远超过您的需要,因为在给定阈值之前,素数总是比自然数少,即length [2,3] &lt; length [1,2,3] 等。

希望其他人可以为您提供更优雅的解决方案。但这一个有效。

【讨论】:

  • 不幸的是,我在尝试此操作时遇到错误:q1.hs:8:55: 错误: • 没有因使用“/”而产生的 (Fractional Integer) 实例 • 在第二个'(mod x == 0,x
  • 我不恰当地使用了/ 运算符;我将其切换为完成相同功能的时间运算符。你可以试试那个。
  • 这行得通,但不幸的是,程序并没有停止运行。还为所有结果添加了 x*2
  • 你能发布你的完整代码吗?问题可能不是您所显示的。
  • 我已经将问题指向了两个重复项,它们很好地解释了问题和正确的解决方案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-06-18
  • 2014-04-03
  • 1970-01-01
  • 1970-01-01
  • 2014-08-09
  • 2022-08-17
  • 2019-09-06
相关资源
最近更新 更多