Закрытая форма Фибоначчи - PullRequest
0 голосов
/ 11 ноября 2018

Я использую Python для создания Фибоначчи, используя эту формулу:

enter image description here

У меня есть эта рекурсивная функция Фибоначчи:

def recursive_fibonacci(n):
if n <= 1:
    return int((((1 / (5 ** 0.5)) * (1 + (5 ** 0.5))) ** n) - (((1 / (5 ** 0.5)) * (1 - (5 ** 0.5))) ** n))
else:
    return(recursive_fibonacci(n - 1) + recursive_fibonacci(n - 2))

Чтобы отобразить это, я использую это:

nterms = 10

if nterms <= 0:
    print("Please Enter a positive integer")
else:
    print("Recursive Fibonacci Sequence: " ,
        [recursive_fibonacci(i) for i in range(nterms)])
    print("Iterative Fibonacci Sequence: " ,
        [iterative_fib(i) for i in range(nterms)])

Как бы я использовал итеративную функцию с этим Фибоначчи?

Я пытался использовать это:

def iterative_fib(n):
    equation = lambda n: int((((1 / (5 ** 0.5)) * (1 + (5 ** 0.5))) ** n) - (((1 / (5 ** 0.5)) * (1 - (5 ** 0.5))) ** n))
    if n <= 1:
        return equation(n)
    else:
        a, b = 1, 2
        for i in range(n):
            fn = equation((i-a)+(i-b))
        return fn

Однако эта итеративная функция, похоже, не имеет такой же вывод, как рекурсивная функция.

вывод рекурсивной функции:

Recursive Fibonacci Sequence:  [0, 2, 2, 4, 6, 10, 16, 26, 42, 68]

Выход итерационной функции:

Iterative Fibonacci Sequence:  [0, 2, 2, 2, 3, 6, 13, 27, 58, 122]

Ответы [ 2 ]

0 голосов
/ 11 ноября 2018

Я думаю, что вы неправильно поняли выражение f_n для последовательности Фибоначчи, о которой вы упомянули.

Обратите внимание, что это не рекуррентное отношение. Это функция n , то есть она предоставляет значение n -го терма, когда ему дано n .

Следовательно, у вас действительно нет рекурсивного / итеративного решения для генерации всей последовательности Фибоначчи.

Подключение n как 0, 1, 2, 3 .. обеспечивает условия 0, 1, 1, 2, .. серии.

Для иллюстрации, когда n = 3 , f_3 рассчитывается как - enter image description here

0 голосов
/ 11 ноября 2018

Уравнение, которое вы пытаетесь реализовать, представляет собой замкнутую форму ряд Фибоначчи.

Закрытая форма означает, что оценка является операцией с постоянным временем.

g = (1 + 5**.5) / 2  # Golden ratio.
def fib(N):
    return int((g**N - (1-g)**N) / 5**.5)

Контрастность с

def fib_iterative(N):
    a, b, i = 0, 1, 2
    yield from (a, b)
    while i < N:
        a, b = b, a + b 
        yield b
        i += 1

А у нас

>>> [fib(n) for n in range(10)]
[0, 1, 1, 2, 3, 5, 8, 13, 21, 34]
>>> list(fib_iterative(10))
[0, 1, 1, 2, 3, 5, 8, 13, 21, 34]
...