【发布时间】:2011-02-16 03:05:01
【问题描述】:
我对 Haskell 比较陌生。问题是找到不大于 400 万的所有偶数斐波那契数的总和。我不能使用列表。
如果我理解正确,下面的解决方案是错误的,因为它使用了列表:
my_sum = sum $ filter (odd) $ takeWhile (< 4000000) fibs
其中 fibs 是所有斐波那契数列。
不知何故,我发现在 Haskell 中不考虑列表是很困难的。谁能指导我解决这个问题?
问候
编辑:
如果有人感兴趣,我已经解决了这个问题。这是代码(看起来很笨拙,但仍然有效):
findsum threshold = findsum' 0 1 0 threshold
findsum' n1 n2 accu t
| n2 > t = accu
| odd n2 = findsum' n2 n3 accu t
| otherwise = findsum' n2 n3 accu2 t
where
n3 = n2 + n1
accu2 = accu + n2
【问题讨论】:
-
这是作业吗?你已经尝试过什么?
-
不是作业 - 欧拉计划。前几天我刚做了这个确切的问题。
-
为什么不能使用列表?
-
@mjboggess:我写了一个基于列表的解决方案。我正在寻找有关如何在没有列表的情况下执行此操作的提示。
-
@Rafal - 但为什么呢?在 Haskell 中,有一个合适的 fibs 定义——即使有一个列表,它也是惰性的。您最好让所有出色的机器完成工作并直接表达解决方案。如果 fibs 定义正确,内存中永远不会存在实际的列表!