关于对斐波那契数列的三种解法的思考:递归解法、备忘录解法、简易版动态规划解法(Python)

斐波那契数列

在这里插入图片描述

解法一:递归解法

def fib(n):
   if n <= 1:
       return n
   else:
       return fibo(n-1) + fibo(n-2)
print(fib(5))

递归解法其实比较简单的解法
但是它耗用的时间比较长
简而言之,它有一个递归树
读者画图就可以明白了,它递归的次数是2^n

解法二:备忘录解法

#带备忘录的递归算法
def fib(n):
    memo=[ 0 for i in range(n+1)]
    return helper(memo,n)
#这里的索引从1开始
def helper(memo,n):
    if n==0 or n==1:
        return n
    if memo[n]!=0:
        return memo[n]
    memo[n]=helper(memo,n-1)+helper(memo,n-2)
    return memo[n]
print(fib(4))

备忘录解法相对与递归在写法上比较复杂
备忘录的作用是将已经计算过的数值存储在列表里面
这样就可以防止递归树的产生,就只有一个递归链
递归的次数是n次

但是前两种方法都是从上到下,找到最底下的数值再往上进行遍历,计算次数较为多

解法三:动态规划

这是一个简易版的动态规划算法
自底向上,逐步求和,这样可以节省计算机计算的很多步骤,提高速度

#动态规划
def fib(n):
    if n==0:
        return 0
    dp=[0 for i in range(n+1)]
    #基础数据
    dp[0]=0
    dp[1]=1
    #状态转移
    for i in range(2,n+1):
        dp[i]=dp[i-1]+dp[i-2]
    return dp[n]
print(fib(5))

或者

n = int(input())
F1, F2 = 1, 1
for i in range(3, n + 1): 
    F1, F2 = F2 , (F1 + F2) 
print(F2)


posted @ 2021-04-09 10:48  Zeker62  阅读(234)  评论(0编辑  收藏  举报