1 -
def fib1(n):
a = 0
b = 1
while a < n:
print b
a = b
b = a+b
2 -
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 :(得分:8)
在fib 1中
a = b
覆盖a
,
表示a
不再是语句的正确值
b = a+b
但是,在您的第二个示例中,这些内容同时发生在a,b = a, b+a
行上,这意味着a
仍然是正确的值。
答案 1 :(得分:0)
这是一个快速回答:
基本区别在于重新分配a
和b
的值的方式。
在fib1()
中,您有
a = b
b = a + b
在fib2()
中,您有
a, b = b, b + a
现在,这两个看起来是平等的,但事实并非如此。 这就是原因:
在fib2()
中,您将元组(b, b + a)
的值分配给元组(a, b)
。因此,重新分配值是同时的。
但是,对于fib1()
,您首先使用b
将a
的值分配给a = b
,然后将值a + b
分配给b
。由于您已经更改了a
的值,因此您实际上正在执行
b = a + b = b + b = 2b
换句话说,你正在做a, b = b, 2b
,这就是为什么你得到2的倍数而不是斐波纳契数列。
答案 2 :(得分: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
一样使用元组解包。