2012-04-19 113 views
0

我在項目歐拉問題2有問題。目標是找到斐波那契數列中不超過四百萬的偶數項的和。出於某種原因,我一直得到0作爲我的輸出。我究竟做錯了什麼?項目歐拉#2 - Python v3.2.3

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) 
+2

你來自Java或C背景嗎?在Python中'main'不會自動調用。您需要顯式調用您的函數才能執行它。 – Wilduck 2012-04-19 16:29:17

+0

是的,我有一個C++背景。我剛開始學習Python。很高興知道主不是自動的 - 謝謝。 – JayJay1122 2012-04-19 21:15:30

回答

4

的一些問題:

  • 你永遠調用main功能。您必須明確地調用它才能執行。

  • 變量termcounttotalmain的作業不會寫的全局變量。相反,將創建具有相同名稱的不同本地變量,即使在調用main之後,全局變量仍將具有值0。解決這個問題

    一種方法是添加行global term, count, totalmain。但這是糟糕的設計。更好的是刪除全局變量(讓它們本地main),並有main返回total值。然後print(main())將顯示結果。

  • 您只需在main中撥打fibonacci一次 - 您需要將其放入循環中。否則,循環將無限運行,因爲term從不更新。

+0

太棒了,謝謝!它現在有效。 – JayJay1122 2012-04-19 16:40:24

3

這是因爲你永遠不會打電話給主或斐波那契。 你只分配

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

然後

print (total) 

如果你想執行main,你必須明確地調用它,例如通過把main()print (total)

前你在你的代碼中的另一個問題。您嘗試從函數內增加全局變量total。這是行不通的,除非你聲明總共global這個函數。在首次使用總數之前,通過將global total放入函數中來實現。計數和術語同樣存在問題。 而且你的控制流程似乎也有問題。這不會產生正確的答案。

0

此行添加到您的腳本的底部:

if __name__ == "__main__": 
    main() 

,將調用main()當你運行該文件的Python腳本。

BTW有一個更好的解決項目歐拉的問題,您可以生成甚至斐波那契條款,而不是直接過濾。養成現在尋找智能解決方案的習慣,否則當問題變得具有挑戰性時,您會遇到困難。

+0

啊,好的。我甚至沒有意識到這是一個無效的解決方案。謝謝! – JayJay1122 2012-04-19 16:40:13