关于对斐波那契数列的三种解法的思考:递归解法、备忘录解法、简易版动态规划解法(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)


  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Zeker62

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值