Python两行实现斐波那契数列及动态规划改进

递归

斐波那契数列本质可以看作一个递归,即:Fibonacci(n)=Fibonacci(n-1)+Fibonacci(n-2)

因此有:

#递归版Python代码
def Fibonacci(n):
    return n if n < 2 else Fibonacci(n-1)+Fibonacci(n-2)

递归代码简单明了,但时间和空间复杂度都较高,尤其是在n较大的情况下。可以考虑用动态规划做出改进。

动态规划

​对于Fibonacci数列,计算第100项的时候,需要计算第99项和98项;在计算第101项的时候,需要第100项和第99项,这时候你还需要重新计算第99项吗?不需要,你只需要在第一次计算的时候把它记下来就可以了。

​上述过程中需要再次计算的“第99项”,即为动态规划算法中的“重叠子问题”。如果没有计算过,就按照递推式计算,如果计算过,直接使用,就像“缓存”一样,这种技巧,是典型的以空间换时间。

​对于Fibonacci数列,如果只需求出第n项,则在计算过程中只要保存前两项,而无需保存整个Fibonacci数列,因此,可以有以下简单且复杂度较低的动态规划版Python代码:

#动态规划版Python代码
def Fibonacci(n):
    a=0
    b=1
    for i in range(n-1):
        a=a+b
        a,b=b,a
    return b

猜你喜欢

转载自blog.csdn.net/songyunli1111/article/details/80283429