2015-03-03 5 views
0

Я обрабатываю последовательность фибоначчи путем итерации. Я ожидал, что следующие две функции обеспечат одинаковые результаты, но они этого не делают.Python Fibonacci последовательность и последовательность распаковки

Пример 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 

Different чем ...

a = b 
b = a + b 

ответ

0

a, b = b, a + b сначала оценить правую сторону =, а затем назначить его на левую сторону. То есть результаты в a и b будут основаны на расчете с предыдущими значениями (до этой строки). В то время как второй код выполняет точно то, что записывается последовательно, а вторая строка оценивается со значениями, полученными в первой строке.

+0

спасибо. Для пояснения, как может выглядеть многострочное решение для 'a, b = b, a + b'? –

+0

Например, вы можете ввести временную переменную для хранения предыдущего результата 'a':' c = a' 'a = b' ' b = c + b' –

0

Первый возвращает результат оценки правого значения (a + b) и использует его для назначения. То есть, оценивайте (a + b) и THEN присваивание (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 
Смежные вопросы