2017-01-05 4 views
0

, поэтому я новичок в программировании (как вы увидите из моего глупого вопроса). Я действительно застрял с этим битом:Fibonacci - я застрял

def Fibonnaci(): 
    num = int(raw_input("How many numbers? ")) 
    i = 1 
    if num ==0: 
     fib = [] 
    elif num ==1: 
     fib = [1] 
    elif num ==2: 
     fib = [1,1] 
    elif num >2: 
     fib = [1,1] 
    while i < (num - 1): 
     fib.append(fib[i] + fib[i -1]) 
     i += 1 
    return fib 
print Fibonnaci() 

То, что я не получаю это fib.append(fib[i] + fib[i-1])

Так позволяет сказать, номер я выбрал на входе является 5. Таким образом, список fib будет содержать [1,1]. Тогда i будет 1. Теперь я запутался. Если i в fib[i] равен 1, то i-1 является 0. 1+0 - 1, а распечатка должна быть [1,1,1,3,5]. Это произошло, когда я удалил fib. и оставил его только как fib.append(i+(i-1)).

Так что я полагаю, что fib делает что-то важное, но я не могу понять, что. Потому что на данный момент i = 1. Итак, как же выглядит список 2? Выходной сигнал 1,1,2,3,5. Даже если fib[i] будет означать, что i теперь 2 как есть [1,1] в списке, то она будет идти 2+1 = 3 отсюда fib теперь будет [1,1,3].

Надеюсь, я полностью не смутил вас (потому что я сбиваю с толку).

+0

Вы пытаетесь написать программу, которая печатает числа Фибоначчи? – Douglas

+0

Если 'i == 1', то' fib [i] == fib [1] == 1' и 'fib [i-1] == fib [0] == 1'. Поэтому 'fib [i] + fib [i-1] == 1 + 1 == 2', и список изменяется как' fib.append (2) '. –

+0

Последовательность Фибоначчи начинается с 1, 1, 2, 3, 5; начиная с 1, 1, вы добавляете эти два числа и результат в 2 и добавляете их в список. Я не совсем точно тестирую ваш код, но вы говорите, что массив содержит 1, 1, 2, 3, 5, и вы ожидаете, что он будет содержать 1, 1, 3, 5 вместо этого? – Makoto

ответ

3

Если один пишет fib[i] это означает, что выражение расширяется до значения в списке fib по индексу i.Так что мы построили fib и это:

fib = [1,1] 

Первая итерация

Теперь i = 1 и мы выполняем следующую строку:

fib.append(fib[i]+fib[i-1]) 

Теперь то, что это значит, первое выражение расширяется подставляя i в 1, мы таким образом читаем:

fib.append(fib[1]+fib[1-1]) 

или

fib.append(fib[1]+fib[0]) 

Теперь второй (списки начинаются с индекса 0) значение fib (fib[1]) является 1 и поэтому является первым элементом (fib[0]), поэтому мы расширяем это:

fib.append(1+1) 

или:

fib.append(2) 

Теперь Python выполнит это действие и fib сейчас:

fib = [1,1,2] 

Вторая итерация

После fib изменяется, i обновляется (теперь i = 2), и поэтому мы идем к следующей итерации. В этой итерации мы снова выполнить:

fib.append(fib[i]+fib[i-1]) 

так i=2, мы можем заменить это на:

fib.append(fib[2]+fib[1]) 

теперь третий (fib[2]) и вторым элементом (fib[1]) списка являются 1 и 2 соответственно (вы можете проверить это с конца предыдущего раздела), и, таким образом, Python будет работать:

fib.append(2+1) 

, который, таким образом, что эквивалентно:

fib.append(3) 

Таким образом, после этой итерации, fib равно:

fib = [1,1,2,3] 

Этот процесс повторяется до тех пор, пока i получает связанный. Поэтому каждый раз, Python читает последние два элементов из списка fib, построенного таким образом, добавляет их вместе и добавляет их в конец списка (fib). Наконец, если граница достигнута, результат возвращается.

+0

О, я вижу! Таким образом, i в этом случае действительно ссылается на позицию в списке, а не на номер как таковой. Большое спасибо! – Loki

+0

@ Loki: действительно. Позиция обычно называется * индексом * в информатике. –

2

i является только прилавком здесь. Последняя часть может быть изменена таким образом:

# we need to repeat n-2 times (i.e. once for a list of 3) 
for i in range(num-2): 
    # fib is the array of numbers we already have 
    # we append sum of the last two elements n-2 times 
    fib.append(fib[-1] + fib[-2]) 
return fib 

В исходном примере, так как i такой же, как длина fib, он используется в качестве индекса. Так, fib[i] является последним элементом и fib[i-1] является последним, но один

+1

Я думаю, что здесь отсутствует OP, это концепция * индекса * списка, вводя отрицательные индексы, я не думаю, что OP упростит понимание того, как это работает. –

+0

Да, я не понял, что использовал индекс. Получил это сейчас. Должно было видеть это действительно :) Спасибо, ребята – Loki