斐波那契数列
1.递归实现
递归实现最简单,但是最慢。f(9)=f(8)+f(7),f(8)=f(7)+f(6),数字每增加1,计算量几乎大一倍。
def fbnq1(n):
if n==0 or n==1:
return 1
return fbnq1(n-1)+fbnq1(n-2)
f(9)要计算一次f(7),f(8)也要重新计算一次f(7)。递归不能存储前面计算的结果,每次都要重新计算,所以慢。
2.列表实现
将前两个元素之和追加到列表末尾,直接返回列表最末端数。比递归快点,时间复杂度降低,但是又增加了空间复杂度。
def fbnq2(n):
list=[1,1]
for i in range(2,n+1):
list.append(list[-1]+list[-2])
return list[-1]
3.变量实现
递归虽能存储前面计算的结果,但是并不需要存储所有之前计算的结果,只需要存储前两项就可以了。
def fbnq3(n):
a=1
b=1
c=0
if n== 0 or n==1:
return 1
else:
for i in range(2,n+1):
c=a+b
a=b
b=c
return c
也可以稍微改进一下
def fbnq4(n):
a=1
b=1
c=1
for i in range(2,n+1):
c=a+b
a=b
b=c
return c
变量应该比列表快点,因为去掉了空间复杂度
4.通项公式
百度搜一下斐波那契数列的通项公式
因为
5
\sqrt 5
5是一个小数,随着n增大,误差可能会越来越大,这里就不写代码了。