题目表述:
大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项(从0开始,第0项为0)。n<=39
'''
Creat by HuangDandan
2018-08-23
dandanhuang@sjtu.edu.cn
三种方法求斐波那契额数列值
Fabonacci0 自上而下的递归,存在的重复的结点,时间复杂度随着n的增加指数增长,效率很低
Fabonacci1 自下而上的递归,时间复杂度为O(n)
Fabonacci2 利用斐波那契数组的特性进行数列求解,直接求解时间复杂度O(n)
Fabonacci3 利用斐波那契数组的特性进行数列求解,采用递推的算法求n次方,时间复杂度可以达到O(logn)
关键是对递推的理解
'''
#自上而下的递归,时间复杂度随着n的增加指数增长
def Fabonacci0(n):
if n <=0:
return 0
elif n ==1:
return 1
else:
return (Fabonacci0(n-1)+Fabonacci0(n-2))
#自下而上的递归,时间复杂度为O(n)
def Fabonacci1(n):
if n <=0:
return 0
elif n ==1:
return 1
else:
temp0 = 0
temp1 = 1
for i in range(2, n+1):
res = temp0 + temp1
temp0 = temp1
temp1 = res
return res
import numpy as np
# 直接求二维数组的n次方,时间复杂度为O(logn)
def Fabonacci2(n):
base = np.array([[1, 1], [1, 0]])
res = [[1, 0], [0, 1]]
if n <= 0:
return 0
elif n == 1:
return 1
else:
for i in range (2,n+1):
res = np.dot(res, base)
return res[0][0]
#直接求二维数组的n次方,时间复杂度为O(n)
def Fabonacci3(n): #返回值为数值
if n <= 0:
return 0
elif n == 1:
return 1
elif n == 2:
return 1
else:
return FabonacciCord(n-1)[0][0]
#FabonacciCord函数求[[1,1],[1,0]]^n的值,递推求解
def FabonacciCord(n): #n是形参,取值大于等于1,返回值必须为数组,才能进行递归操作
base = np.array([[1, 1],[1, 0]])
if n <= 0:
return ValueError
elif n == 1:
return base
else:
res = FabonacciCord(n >> 1) #(n-1)//2 >=1 n的取值大于等于3 这样递推操作时才能满足形参大于等于1
res = np.dot(res,res) #res *= res 这是数组array对应位置数值相乘,应该为点乘
if n & 0x1 == 1:
res = np.dot(res,base)
return res
if __name__ == "__main__":
print(Fabonacci2(4))