项目Euler#2 - Python v3.2.3

时间:2012-04-19 16:23:07

标签: python fibonacci memoization

我在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)

3 个答案:

答案 0 :(得分:6)

一些问题:

  • 您永远不会调用main函数。您必须明确调用它才能执行它。

  • term中变量counttotalmain的分配不会写入全局变量。相反,将创建具有相同名称的不同局部变量,即使在调用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项,而不是过滤。养成现在寻找智能解决方案的习惯,否则当问题遇到挑战时你就会碰壁。