2016-06-28 179 views
2

我是Python的新手,這就是爲什麼我在其他人可能會覺得容易的問題上遇到麻煩。Python:在「while」循環中嵌套「If」語句?

這個問題的背景:歐拉項目,問題2.這個問題基本上要求我們在Fibonacci序列中添加所有偶數項,只要每項不超過400萬。我決定通過從一個封閉的公式計算第n個斐波那契項來解決在線顯示的問題。現在,假設這個函數被稱爲Fibonacci(n).

我基本上想要做的是循環未知數量的整數,這些整數表示斐波那契集的索引(即1,2,3,4 ...等)和插件每個值到Fibonacci(n).如果結果不知道何時除以2餘數,那麼這個Fibonacci數添加到初始設置爲0。

這裏是一些價值是我到目前爲止有:

def Fibonacci(n): 
    return (1/(5**0.5))*((((1+5**0.5)/2)**n)-(((1-5**0.5)/2)**n)) 

i=0 
FibSum = 0 
nFib = 0 

while (nFib <= 10): 

    nFib = Fibonacci(i) 

    if(nFib%2==0): 
     FibSum += nFib 

    i += 1 

print FibSum 

(是的,正如你所看到的,我限制斐波那契數列以10結尾,而不是4,000,000;這僅僅是爲了測試的緣故。)

現在,這裏是我的問題:當我運行這個代碼時,我得到2.0而不是10.0(2和8是應該加在一起的兩個斐波那契數字)。

怎麼回事?我的猜測是循環在到達第三個斐波那契數(2)之後停止,並且不會繼續。有人看到我的代碼有問題嗎?

如果您還有其他問題,請發表評論。提前致謝。

+1

只是一個風格和完全不相關的筆記,但你不需要''while'和'if'語句中條件的括號。做例如'而nFib <= 10:'沒問題。 –

+1

這是因爲你使用浮點數學,你得到〜* 8.000000000000002 *而不是8。 –

+0

應該通過做nFib = int(斐波那契(i)) – ShadowFlame

回答

2

由Gal Dreiman提供的解決方案很好,但功能轉換更好,下面是您的修改代碼:

def Fibonacci(n): 
    return int((1/(5**0.5))*((((1+5**0.5)/2)**n)-(((1-5**0.5)/2)**n))) 
+1

我更喜歡從數學的角度來看你的解決方案,因爲斐波那契數列是一個整數序列,我認爲浮點問題是出於計算問題。因此,這個函數只能返回方程在紙面上應該表達的一個整數。謝謝! – daOnlyBG

2

你有一個浮點問題(你可以在here上閱讀) - 返回值'nFib'不是一個整數,也不是一個四捨五入的值。我跑你的代碼,並在每次迭代中添加打印此值,並得到:

0.0 
1.0 
1.0 
2.0 
3.0000000000000004 
5.000000000000001 
8.000000000000002 
13.000000000000002 

對此的解決方案是修改代碼,如下所示:

nFib = int(Fibonacci(i)) 

後,我得到了輸出:10

+0

感謝您的回覆和鏈接! – daOnlyBG

2

問題是與nFib%2==0比較。在這裏,您嘗試比較浮點數LHS和整數0.因此,請按如下所示修改if循環或將返回值修改爲return int((1/(5**0.5))*((((1+5**0.5)/2)**n)-(((1-5**0.5)/2)**n)))

>>> def Fibonacci(n): 
...  return (1/(5**0.5))*((((1+5**0.5)/2)**n)-(((1-5**0.5)/2)**n)) 
... 
>>> i=0 
>>> FibSum = 0 
>>> nFib = 0 
>>> while (nFib <= 10): 
...  nFib = Fibonacci(i) 
...  if(int(nFib%2)==0): 
...    FibSum += nFib 
...  i += 1 
... 
>>> print FibSum 
10.0