1

我在 Project Euler的问题 2上遇到问题。目标是找出斐波那契数列中不超过四百万的偶数项之和。出于某种原因,我一直得到 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)
4

3 回答 3

6

一些问题:

  • 您永远不会调用该main函数。您必须显式调用它才能执行它。

  • 对变量term, count, totalin的赋值main不会写入全局变量。0相反,将创建具有相同名称的不同局部变量,并且即使在main调用之后全局变量仍将具有该值。

    解决此问题的一种方法是global term, count, totalmain. 但这是糟糕的设计。更好的是删除全局变量(使它们都本地化main),并main返回total. 然后print(main())会显示结果。

  • 您只调用fibonacci一次main- 您需要将其放入循环中。否则循环将无限运行,因为term永远不会更新。

于 2012-04-19T16:29:14.000 回答
4

这是因为你从不调用 main 或 fibonacci。你只需分配

total = 0
count = 0
term = 0
fibonacciMemo = {0:0, 1:1}

进而

print (total)

如果你想执行main,你必须明确地调用它,例如放在main()前面print (total)

您的代码中还有另一个问题。您尝试total从函数内递增全局变量。那是行不通的,除非你global向这个函数声明总。global total在第一次使用 total 之前放入函数来做到这一点。计数和术语同样的问题。而且您的控制流似乎也有问题。这不会产生正确的答案。

于 2012-04-19T16:28:14.937 回答
2

将此行添加到脚本的底部:

if __name__ == "__main__":
    main()

main()当您将文件作为 Python 脚本运行时,它将调用。

顺便说一句,Project Euler 问题有一个更好的解决方案,您可以直接生成偶数斐波那契项而不是过滤。养成立即寻找智能解决方案的习惯,否则当问题变得具有挑战性时,您将碰壁。

于 2012-04-19T16:34:38.910 回答