递归
斐波那契数列本质可以看作一个递归,即: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