用动态规划解决斐波那契数列问题

动态规划三板斧:
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)。也就是前面的只算一遍,后面的是在前面基础上继续算,空间换时间,时间复杂度比递归就低得多。

posted @ 2023-10-19 11:17  年轻人——001  阅读(112)  评论(0编辑  收藏  举报