斐波那契和他的不死兔子_斐波那契数列实现_python_动态规划经典案例_递归案例

发个库存吧!希望对您有所帮助

目录

什么叫斐波那契数列

斐波那契数列的由来

斐波那契数列的特点

斐波那契数列的实现

递归解法

半动态规划半递归解法

动态规划解法


什么叫斐波那契数列

 

斐波那契数列的由来

从前有个叫斐波那契的数学家,第一次提出了这个问题。说(开始讲起了rap,本故事纯属虚构,但是是这个意思),这斐波那契很有钱,有一对兔子小甜甜,他们的功能可真是能上天,一直不死就想花光斐波那契的钱。一月出生,二月成年,三月生对小兔甜。(结束rap)斐波那契有点蒙圈,统计了一下每月的兔子。咦?这兔子长得怎么这么有规律,于是发到了学术界,引起国际风波。

咳咳, 上网找了一个比较满意的图。

如果把每个月的兔子数以对为单位统计一下,那么可以发现,组成了一个数列。像这样:1,1,2,3,5,8,13,21.......this is 斐波那契数列。

斐波那契数列的特点

斐波那契数列的特点是:从第三个数开始,每个数都是前两数之和。即:

 现在欠欠的出题人又把此数列编为了考题,偏要让你算一算,这个数列的第n项是多少。

斐波那契数列的实现

递归解法

思路:这题用递归解就很简单,要知道n项的值要知道n-1项的值和n-2项的值,把它俩相加就得到了n项的值,但n-1和n-2不知道怎么办,求n-1要知道n-1-1和n-1-2,求n-2要知道n-2-1和n-2-2........以此类推,直到递归到了n=1或n=2,我们知道1项和2项的值——1。这样就可以写出代码了

代码:

def fb(n):
    if n==1 or n==2:  # 递归停止条件(说白了就是已知条件)
        return 1
    else:
        return fb(n-1)+fb(n-2)  # 重复调用自身 求出结果
n=int(input())
print(fb(n)) 

半动态规划半递归解法

递归求法固然很好理解也很好写,但有漏洞,就是运算时间,专业术语叫时间复杂度。可以通过一个例子:当n=50时,递归算法需要很长很长的时间,如果是使用笔记本电脑的,都可以听见排气的巨大的呼呼声。为什么呢?因为用很多重复运算量,如下图:

 那么我们怎么办捏?很简单,就像你批卷子。批选择题(这里的前提是你没有答案),第一遍你一个一个题都算一遍,第二遍你还算吗?把第一遍的答案记住就好了嘛。这道题也是这样,你算一个新的,就把它的结果保存了,再遇到它的时候就直接调取结果就行了。这样就能达到减少运算量的目的

def fb2(n,l):
    if n==1 or n==2:  # 递归停止条件
        return 1
    elif l[n]!=0:  # 判断我们是否运算过
        return l[n]
    else:
        l[n]=fb2(n-1,l)+fb2(n-2,l) 
        return l[n]
n=int(input())
l=[0 for i in range(n)]  # 创建一个n这么长的列表,算一个进来一个
print(fb2(n,l))

 

动态规划解法

相信很多同学在上一题就发现玄鸡了。那我们调换一下思维方式,不是更简洁了吗:以前都是层层倒退反推f(n),那咱们这回正面迎战,直接给你创建一大长溜斐波那契数列,你要哪个你随便拿!d当然我们都是节省的好孩子,创建到n就得了啊。

def fb3(n,l):
    l[0]=1  # 已知量
    l[1]=1
    for i in range(2,n+1):  # 开始从第三位创建斐波那契数列
        l[i]=l[i-1]+l[i-2] 
    return l[n]
n=int(input())
l=[0 for i in range(n)]
print(fb3(n,l))

 结语

希望各位都有美好的一天,希望各位能不受掉发的搅扰,不受bug的折磨,在强撑佛性的生活中找到乐趣!害,幸好我不是程序员。祝各位程序员安康

  • 5
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 8
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值