Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ruby-on-rails-3/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 2.7 Python-Fibonacci序列与序列解包_Python 2.7 - Fatal编程技术网

Python 2.7 Python-Fibonacci序列与序列解包

Python 2.7 Python-Fibonacci序列与序列解包,python-2.7,Python 2.7,我正在迭代处理斐波那契序列。我期望以下两个函数提供相同的结果,但它们没有 示例1根据需要返回斐波那契序列: def run(): for x in range(0,20): fib(x) def fib(n): a, b = 0, 1 for i in range(n): a, b = b, a + b print a run() 示例1结果: 0 1 1 2 3 5 8 13 21 34 例2无顺序拆包: def

我正在迭代处理斐波那契序列。我期望以下两个函数提供相同的结果,但它们没有

示例1根据需要返回斐波那契序列:

def run():
    for x in range(0,20):    
        fib(x)

def fib(n):
    a, b = 0, 1
    for i in range(n):
        a, b = b, a + b
    print a

run() 
示例1结果:

0
1
1
2
3
5
8
13
21
34
例2无顺序拆包:

def run():
    for x in range(0,20):    
        fib(x)

def fib(n):
    a = 0
    b = 1
    for i in range(n):
        a = b
        b = a + b 
    print a

run() 
示例2结果:

0
1
2
4
8
16
32
64
128
256
具体来说,为什么

a, b = b, a + b
不同于

a = b
b = a + b

a、 b=b,a+b首先计算=的右侧,然后将其分配给左侧。即,a和b中的结果将基于该行之前的先前值的计算。当第二行代码执行顺序写入的操作时,第二行使用第一行中获得的值进行求值。

第一行返回右侧值a+b的求值结果,并将其用于赋值。也就是说,计算a+b,然后分配a=b和b=result 而第二个值在可以用于等式之前会覆盖a中的值

也就是说,通过以下循环:

a=b
b=a+b
结果是:

a = 0, b = (0 + 1), print a: 0
a = 1, b = (1 + 1), print a: 1
a = 2, b = (2 + 2), print a: 2
a = 4, b = (4 + 4), print a: 4
您需要的是一个临时返回值,因为在对语句a+b求值之前,您不想更新a或b的值

def fib(n):
    a = 0
    b = 1
    for i in range(n):
        temp = a + b
        a, b = b, temp
    print a

非常感谢。为了澄清,a,b=b,a+b的多行解决方案可能是什么样的?例如,您可以引入一个临时变量来存储以前的a结果:c=a a=b=c+b