def fib1(n):
a = 0
b = 1
while a < n:
print b
a = b
b = a+b
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
def fib1(n):
a = 0
b = 1
while a < n:
print b
a = b
b = a+b
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
在FIB 1 a = b
覆蓋的a
值,
這意味着a
不再是該語句的正確的價值
b = a+b
然而,在第二個例子中這兩個事情發生在同一行a,b = a, b+a
就意味着a
仍然是正確的值。
我不能這樣做,這些事情是怎麼發生的?我猜在fib1()和fib2()a = b中都會用新的b = a + b覆蓋a的值。 – Moo
RHS在分配給左側之前發生。 所以B + A將被計算,那麼B會被計算,則b將被分配到一個+ b和一個將被分配給b – dustinroepsch
例如,當你說 B = A + B 的首先發生的是'a + b'被計算並存儲在內存中的某處。在計算之後,該值被移入。 同樣的事情發生在這種情況下 a,b = b,b + a 首先,計算b + a並將其存儲在臨時的某處。 然後b被計算並存儲在臨時的某處。 最後b = a + b) 的計算值和a = b – dustinroepsch
這裏有一個快速的答案:
的基本區別是a
和b
值重新分配的方式。 在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的倍數,而不是斐波那契序列。
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
。
對不起我修正定義:)打字錯誤 – Moo
看到這個問題在這裏發佈的同一個問題前一段時間。問題從哪裏來? – AK47