2016-04-20 179 views
3
def fib1(n): 
    a = 0 
    b = 1 
    while a < n: 
     print b 
     a = b 
     b = a+b 

2-爲什麼這兩個python函數返回不同的結果?

def fib2(n): 
    a, b = 0,1 
    while a < n: 
     print b 
     a,b = b, b+a 

在執行時:

fib1(10)我答錯:0 1 2 4 8

fib2(10)我得到了正確的答案:0 1 1 2 3 5 8

+0

對不起我修正定義:)打字錯誤 – Moo

+0

看到這個問題在這裏發佈的同一個問題前一段時間。問題從哪裏來? – AK47

回答

8

在FIB 1 a = b 覆蓋的a值,

這意味着a不再是該語句的正確的價值

b = a+b

然而,在第二個例子中這兩個事情發生在同一行a,b = a, b+a就意味着a仍然是正確的值。

+0

我不能這樣做,這些事情是怎麼發生的?我猜在fib1()和fib2()a = b中都會用新的b = a + b覆蓋a的值。 – Moo

+1

RHS在分配給左側之前發生。 所以B + A將被計算,那麼B會被計算,則b將被分配到一個+ b和一個將被分配給b – dustinroepsch

+1

例如,當你說 B = A + B 的首先發生的是'a + b'被計算並存儲在內存中的某處。在計算之後,該值被移入。 同樣的事情發生在這種情況下 a,b = b,b + a 首先,計算b + a並將其存儲在臨時的某處。 然後b被計算並存儲在臨時的某處。 最後b = a + b) 的計算值和a = b – dustinroepsch

0

這裏有一個快速的答案:

的基本區別是ab值重新分配的方式。 在fib1(),你有

a = b 
b = a + b 

而在fib2(),你有

a, b = b, b + a 

現在,這兩個看起來平等的陳述,但事實並非如此。 原因如下:

fib2()中,您將元組(b, b + a)的值分配給元組(a, b)。因此,重新分配值是同時發生的。

然而,隨着fib1(),你第一次使用a = b分配的b價值a然後a + b將值賦給b。既然你已經改變了a值,你是在做效果

b = a + b = b + b = 2b 

換句話說,你正在做a, b = b, 2b,這就是爲什麼你所得到的2的倍數,而不是斐波那契序列。

+0

謝謝約翰,這對我非常有用:) – Moo

+0

不客氣。 – jtitusj

0

fib1包含經典錯誤。它與交換兩個變量的值在同一領域。想想你會如何在C或C++中做到這一點。

int a = 3; 
int b = 5; 
int temp; 
temp = a; /* 3 */ 
a = b; /* 5 */ 
b = temp; /* 3, hence swapped */ 

有一種方法,而不temp做的,雖然也有涉及中間計算。現在在Python中,如果您是而不是要利用tuple解包功能,則必須包含temp變量。

a = 3 
b = 5 
temp = a 
a = b 
b = temp 

OR

a = 3 
b = 5 
a_ = (a+b)/2 - (a-b)/2 # 5.0 
b_ = (a+b)/2 + (a-b)/2 # 3.0 

更好地利用元組拆包作爲fib2

相關問題