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