Калькулятор последовательности Фибоначчи кажется правильным, но он не может найти подобный код онлайн. Что-то не так? - PullRequest
6 голосов
/ 09 мая 2019

Я сделал простой калькулятор последовательности Фибоначчи для первых 22 терминов:

i=1
n=0
while i<=20000:
    i = i + n
    n = i - n
    print(i)

Похоже, что результат правильный

1
2
3
5
8
13
21
34
55
89
144
233
377
610
987
1597
2584
4181
6765
10946
17711
28657

, но я не могу найти подобный кодв любом месте онлайн.Я думаю, что это большой красный флаг.Может кто-нибудь сказать мне, что здесь не так?Это неэффективный код?

Ответы [ 2 ]

8 голосов
/ 09 мая 2019

Нет, этот код в порядке. Вероятная причина, по которой вы не можете найти подобный код в Интернете, заключается в том, что в Фибоначчи необычно использовать оператор вычитания, который является чисто аддитивной функцией, t<sub>n</sub> = t<sub>n-2</sub> + t<sub>n-1</sub>.

Конечно, это работает, поскольку сложение / вычитание является как коммутативным, так и ассоциативным, что означает, что порядок и группировка терминов не важны:

i = i + n  # iNew = iOld + nOld

n = i - n  # nNew = (iNew)        - nOld
           #      = (iOld + nOld) - nOld
           #      = iOld + (nOld  - nOld)
           #      = iOld + (0)
           #      = iOld

Использование вычитания позволяет вам обойтись без третьей переменной, что было бы примерно так в меньшем языке, чем Python:

nextN = i + n
i = n
n = nextN

В Python вам не нужно , так как вы можете использовать присваивание кортежей, например:

(n, i) = (i, n + i)

При этом все справа от = оценивается перед любым назначением слева.

5 голосов
/ 09 мая 2019

Это необычный способ сделать это, но это правильно.Ваши строки:

i = i + n
n = i - n

такие же, как и:

new_i = i + n
n = i
i = new_i

или

i, n = i + n, i

, что было бы обычным способом в Python.

...