【问题标题】:Project Euler #2 - Python v3.2.3欧拉计划 #2 - Python v3.2.3
【发布时间】:2012-04-19 16:23:06
【问题描述】:

我在使用 Project Euler 的 problem 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)

【问题讨论】:

  • 您是 Java 还是 C 背景?在 python 中 main 不会自动调用。您需要显式调用您的函数才能执行。
  • 是的,我有 C++ 背景。我刚刚开始学习 Python。很高兴知道 main 不是自动的 - 谢谢。

标签: python fibonacci memoization


【解决方案1】:

一些问题:

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

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

    解决此问题的一种方法是在main 中添加行global term, count, total。但这是糟糕的设计。更好的是删除全局变量(将它们全部设为main 的本地变量),并让main 返回total 的值。然后print(main())会显示结果。

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

【讨论】:

    【解决方案2】:

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

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

    然后

    print (total)
    

    如果你想执行main,你必须显式调用它,例如通过将main() 放在print (total) 前面

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

    【讨论】:

      【解决方案3】:

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

      if __name__ == "__main__":
          main()
      

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

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

      【讨论】:

      • 啊,好吧。我什至没有意识到这是一个低效的解决方案。谢谢!
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多