【发布时间】: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