【问题标题】:ProjectEuler Q2: Haskell solution won't evaluateProjectEuler Q2:Haskell 解决方案不会评估
【发布时间】:2018-06-10 20:42:49
【问题描述】:

我邀请您从project Euler 中查看以下与斐波那契相关的问题。该问题要求用户首先生成一个能够返回第 n 个斐波那契数的斐波那契数列或函数。我使用 zipWith 解决方案生成了一个惰性/无限的斐波那契数列表:

fibs = 0 : 1 : zipWith (+) fibs (tail fibs)

接下来,问题要求将列表限制为小于 4e6 的斐波那契数/值,然后对偶数求和。我认为这将是一个非常简单的列表理解:

sum [x | x<-fibs, even x && x < (4*10^6 + 1)]

这个表达式不会完成评估....我认为它会继续直到它找到最右边的数字(第一个fib大于4e6,列表中的第34个元素fibs!!34)然后终止列表,对少量整数求和。我做错了什么?

【问题讨论】:

  • 当列表不再满足谓词时,您可以使用takeWhile 停止处理列表。
  • 列表是单调递增的,但 haskell 不知道这一点 - 因此它不会仅仅因为您超过与列表理解中的谓词相关的阈值而停止评估元素它。

标签: haskell


【解决方案1】:

ghc 不知道[x | x&lt;-fibs, even x &amp;&amp; x &lt; (4*10^6 + 1)] 应该何时终止,它会尝试耗尽无限列表fibs。换句话说,它会在终止之前尝试用尽无限的斐波那契数列。你应该看看takeWhile

【讨论】:

  • 直接回答是[y | y&lt;- takeWhile (\x -&gt; x &lt; 4*10^6 + 1) fibs, even y]
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-12-24
  • 2011-01-11
  • 2021-07-12
  • 1970-01-01
  • 1970-01-01
  • 2021-07-16
  • 1970-01-01
相关资源
最近更新 更多