【问题标题】:Haskell primes number sequence recursionHaskell素数数列递归
【发布时间】:2015-11-17 23:52:09
【问题描述】:

我需要创建一个不带任何参数的函数 primes 并返回所有素数的列表。 这是我想出的代码:

isqrt = floor . sqrt . fromIntegral
primes = 2:3:(primes' 4)
primes' n = 
        if (all(\y-> (y < isqrt n) && ((n `mod` y) /= 0)) primes) 
        then
           n:primes' (n+1)
        else
           primes` (n+1)

程序只打印 2:3: 然后停止。 由于惰性评估,这不应该起作用吗? (通过将素数作为迄今为止构建的列表,并能够查看我当前的数字是否可以被该列表中的任何数字整除,如果是,则附加它并继续递归,如果不继续下去)。

谁能指出我的错误?

【问题讨论】:

  • 另见:12

标签: haskell recursion primes lazy-evaluation


【解决方案1】:

几点:从技术上讲,您的程序不会打印任何内容。其次,它甚至无法编译——注意最后一行的错字。

至于您的问题:在您的函数中,您在无限列表primes 上调用all,而all 尝试遍历所有这些列表——这就是程序挂起的原因。您只需要从primes 中获取您需要的元素,然后再应用all。例如:

isqrt = floor . sqrt . fromIntegral
primes = 2:3:(primes' 4)
primes' n =
        if (all (\y-> (n `mod` y) /= 0) (takeWhile (<= isqrt n) primes))
        then
           n:primes' (n+1)
        else
           primes' (n+1)

main = print (take 5 primes)

编辑: 按照@behzad.nouri 的建议使用takeWhile

【讨论】:

猜你喜欢
  • 2011-02-14
  • 2019-02-28
  • 1970-01-01
  • 2016-02-16
  • 1970-01-01
  • 2019-07-21
  • 1970-01-01
  • 1970-01-01
  • 2013-12-06
相关资源
最近更新 更多