我在Project Euler上遇到problem 2问题。目标是找到Fibonacci序列中偶数值的总和,其值不超过四百万。由于某种原因,我一直得到0作为我的输出。我做错了什么?
total = 0
count = 0
term = 0
fibonacciMemo = {0:0, 1:1}
def main ():
term = fibonacci (count)
while (term <= 4000000):
if (term % 2 == 0):
total += term
count += 1
def fibonacci (n):
if not n in fibonacciMemo:
fibonacciMemo [n] = fibonacci (n - 1) + fibonacci (n - 2)
return fibonacciMemo [n]
print (total)
答案 0 :(得分:6)
一些问题:
您永远不会调用main
函数。您必须明确调用它才能执行它。
term
中变量count
,total
,main
的分配不会写入全局变量。相反,将创建具有相同名称的不同局部变量,即使在调用0
之后,全局变量仍将具有值main
。
解决此问题的一种方法是在global term, count, total
中添加第main
行。但这是糟糕的设计。更好的方法是删除全局变量(使它们全部变为main
),并让main
返回total
的值。然后print(main())
会显示结果。
您只需在fibonacci
中拨打main
一次 - 您需要将其放入循环中。否则循环将无限运行,因为永远不会更新term
。
答案 1 :(得分:4)
这是因为你从不打电话给主或斐波那契。 你只需要分配
total = 0
count = 0
term = 0
fibonacciMemo = {0:0, 1:1}
然后
print (total)
如果您想执行main
,则必须明确调用它,例如将main()
放在print (total)
您的代码中还有其他问题。您尝试从函数内增加全局变量total
。除非您向此函数声明总计global
,否则这将无效。在首次使用总计之前将global total
放入函数中,这样做。计数和期限相同的问题。
而且你的控制流程似乎也有问题。这不会产生正确的答案。
答案 2 :(得分:2)
将此行添加到脚本的底部:
if __name__ == "__main__":
main()
当您将文件作为Python脚本运行时,将调用main()
。
顺便说一下,Project Euler问题有一个更好的解决方案,你可以直接生成偶数Fibonacci项,而不是过滤。养成现在寻找智能解决方案的习惯,否则当问题遇到挑战时你就会碰壁。