2016-04-20 181 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

相关问题