封闭式斐波那契系列

时间:2018-11-11 00:02:53

标签: python recursion iteration fibonacci

我正在使用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 :(得分:2)

您要实现的方程是closed form斐波那契数列。

闭合形式表示求值是恒定时间操作。

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]

答案 1 :(得分:1)

我认为您误解了您提到的斐波那契序列的表达式 f_n

请注意,这不是重复关系。它是 n 的函数,即当给定 n 时,它提供了第 n 个词的值。

因此,您实际上没有递归/迭代解决方案来在此处生成整个Fibonnaci序列。

n 插入为0、1、2、3 ..提供了该系列的0、1、1、2,..。

举例说明,当 n = 3 时,f_3计算为- enter image description here