用动态规划解决斐波那契数列问题
动态规划三板斧:
1,空间: 一般是初始化一个n项元素的列表
2,求值:求n项的元素值,并且把值存入列表中
3,求和: 求列表里元素之和
def feibo(n):
#一,先初始化一个有n项元素的列表,用于储存斐波那契数列的各项值,这一步很关键,这一步是用空间换时间的操作,和下面递归时间换空间正好相反
dp = [0]*n
print(dp)
#二,求出各n项元素的和
for i in range(n):
if i ==0 or i == 1:
dp[i] = 1
else:
dp[i] = dp[i-1] + dp[i-2]
print(dp)
return sum(dp)
print(feibo(6))
这是从左到右 解决问题,利用列表储存计算过的值,下面用递归的方式解决斐波那契数列的问题:
def feibo(n): if n<=2: return n else: return feibo(n-1)+feibo(n-2) print(feibo(9))
递归是从右到左解决问题,递归版本的时间复杂度是 O(2^n),其中 n 是要计算的斐波那契数列的项数。这是因为在最坏的情况下,每个项都需要被递归地计算两次,因此总的递归调用次数是 2^n。因此,对于大的 n 值,递归版本的效率比动态规划版本低得多。(时间复杂度指的是程序计算需要的步数),递归是时间换空间,没有把结果存起来
动态规划版本的斐波那契数列的时间复杂度是 O(n),其中 n 是要计算的斐波那契数列的项数。这是因为在计算过程中,每个项都会被计算一次并且只被计算一次。因此,对于 n 个项,总的时间复杂度是 O(n)。也就是前面的只算一遍,后面的是在前面基础上继续算,空间换时间,时间复杂度比递归就低得多。
全世界的程序员们联合起来吧!