Python:递归输出斐波那契数列
今天学习Python的时候做一道练习题,题目是这样的:
题目 导入
问题
有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总对数为多少?分析
简单的分析了一下,发现这个问题其实就是斐波那契数列问题。
第一个月兔子对数为1,
第二个月兔子对数还是1,
第三个月,开始生小兔子啦,那么总的对数是1+1=2,
第四个月,老兔子又生了,那么1(最开始的老兔子)+1(第四个月老兔子生的)+1(第三个月老兔子生的)=3
第五个月,1(1老)+1(第五个月老兔子生)+1(第四个月老兔子生)+1(第三个月老兔子生)+1(第三个月老兔子生的小兔子也生了)=5
第六个月,1(1老)+1(第六个月老兔子生)+1(第五个月老兔子生)+1(第四个月老兔子生)+1(第三个月老兔子生)+1(第三个月老兔子生的小兔子也生了)+1(第三个月老兔子生的小兔子又生了)+1(第四个月老兔子生的小兔子也生了)=8
⋮ \vdots
⋮\vdots
⋮\vdots
可以发现,每个月的兔子的对数为 1,1,2,3,5,8,13,⋯1,1,2,3,5,8,13,\cdots
因此,经过一个简单的分析,可以看出来,这道题就是考察的斐波那契数列的。
Python代码实现
这个代码实现的话,应该是有多种实现方法的。
- 直接输出
def rabbit1(n):f1=1f2=1if (n==1 or n==2):return 1else:for i in range(3,n+1):f1,f2=f2,f1+f2return f2
- 递归输出方式一
这个斐波那契数还可以使用递归进行输出,就是非常直观的递归计算。
def rabbit2(n):if (n==1 or n==2):return 1else:return rabbit2(n-1)+rabbit2(n-2)
- 递归输出方式二
这种方式是把之前算过的斐波那契数存在字典中,这样的话递归要用的话就直接存取,而不是去重新计算。
def rabbit3(n,rabbits={1:1,2:1}):if n in rabbits:return rabbits[n]res=rabbit3(n-1)+rabbit3(n-2)rabbits[n]=resreturn res
三种方式的讨论
对于三种方式而言,都可以直接输出结果来。
print(rabbit1(10))
print(rabbit2(10))
print(rabbit3(10))
输出结果为:
55
55
55
可以看出来,程序是没有错的。
现在n=36n=36 ,再试一试,
第一种方式结果
14930352[Finished in 0.3s]
第二种方式结果为:
14930352[Finished in 4.7s]
第三种方式结果为:
14930352[Finished in 0.3s]
可以看出来,直接递归貌似结果就差远了。而第二种递归,把之前的数据存起来而不是计算则就要快很多了。
至于第一种方式,是相当快得,当n很大,依旧可以秒算。比如说n=10000,第一种方式可以计算。而第三种方式就不行了,告诉我不能计算了,报错。至于为什么还没有弄明白。
关于使用Python输出斐波那契数列的补充
今天在学习python迭代器和生成器,大致记录一下:
迭代器
迭代是Python最强大的功能之一,是访问集合元素的一种方式。。
迭代器是一个可以记住遍历的位置的对象。
迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束。迭代器只能往前不会后退。
迭代器有两个基本的方法:iter() 和 next()。
字符串,列表或元组对象都可用于创建迭代器:
#import sys # 引入 sys 模块list=[1,2,3,4]
it = iter(list) # 创建迭代器对象
flag=True
while True:try:print (next(it))except StopIteration:#sys.exit()flag=False
利用迭代器代替for循环,进行列表数据的遍历输出。
生成器
在 Python 中,使用了 yield 的函数被称为生成器(generator)。
跟普通函数不同的是,生成器是一个返回迭代器的函数,只能用于迭代操作,更简单点理解生成器就是一个迭代器。
在调用生成器运行的过程中,每次遇到 yield 时函数会暂停并保存当前所有的运行信息,返回yield的值。并在下一次执行 next()方法时从当前位置继续运行。
以下实例使用 yield 实现斐波那契数列:
def iteration_yield(it):flag = True# a=0while flag:try:print(next(it), end=" ")except StopIteration:# sys.exit()flag = False# print(a)def fibonacci(n):a, b, counter = 0, 1, 0while True:if counter > n:returnyield aa, b = b, a + bprint('%d,%d' % (a, b))counter += 1
f = fibonacci(1000)
iteration_yield(f)
更多具体的内容可以从这个地方学习到:
http://www.runoob.com/python3/python3-iterator-generator.html
Python:递归输出斐波那契数列相关推荐
- python递归求斐波那契数列前20项_用递归算法实现斐波那契数列1,1,2,3,5,8,13……的前20项,每输出5项一换行,用C++...
关于 用递归算法实现斐波那契数列1,1,2,3,5,8,13--的前20项,每输出5项一换行,用C++的搜索结果 回答 请参考这篇文章,https://help.aliyun.com/document ...
- python列表输出斐波那契数列_Python|运用列表求斐波那契数列
问题描述 斐波那契数列,又称黄金分割数列,指的是这样一个数列:0.1.1.2.3.5.8.13.21.34.--.前两项相加等于第三项.求任意一项,通常可以用函数来解题.但我们今天用列表来解题. 解决 ...
- python递归求斐波那契数列前20项_Python 求斐波那契数列前20项和
展开全部 定义:斐波那契数列2113(Fibonacci sequence),又称黄金分割数列,指的是5261这样一个数列:0.41021.1.2.3.5.8.13.21.34.--在数学上1653, ...
- 【Python】输出斐波那契数列
def fib(n):if n==1 or n==2:return nelse:return fib(n-1) + fib(n-2) n = int(input('斐波那契数列的第n项:')) pri ...
- C++递归输出斐波那契数列
/* 解题思路: an=an-2+an-1 */ #include <stdio.h> int fbnq(int n) {if (n <= 2)return 1; //n=1,2 返 ...
- 递归与递推 输出斐波拉契数列的前n项 python
输出斐波拉契数列的前n项 python 递归与递推 文章目录 输出斐波拉契数列的前n项 python 题设 题解 题设 以下数列 0 1 1 2 3 5 8 13 21 - 被称为斐波纳契数列. 这个 ...
- Python输出斐波那契数列【递归、迭代】
Python输出斐波那契数列[递归.迭代] 首先 斐波那契数列的定义是什么? 斐波那契数列指的是这样一个数列:0.1.1.2.3.5.8.13.21.34.--在数学上,斐波那契数列以如下被以递推的方 ...
- 用python输出斐波那契数列的前20项_python输出斐波那契数列
如何用Python输出一个Fibonacci数列有时候觉得自己像个神经病.既纠结了自己,又打扰了别人. #python3def fibo(n): if n受辱时的唯一办法就是忽视它,不能忽视它,就藐视 ...
- 递归函数输出斐波那契数列-黄金分割数列-兔子数列(python)
递归函数输出斐波那契数列-黄金分割数列-兔子数列(python) 斐波那契数列介绍 数学家莱昂纳 多·斐波那契(Leonardoda Fibonacci)以兔子繁殖为例子而引入,故又称为"兔 ...
最新文章
- Python自动化运维——系统进程管理模块
- 在java中使用JMH(Java Microbenchmark Harness)做性能测试
- matlab中double 和single数据类型的差别
- python123m与n的数学运算_python小白进阶之路三——循环结构入门练习+Random库练习...
- Redis教程:数据持久化
- [转载] Python中三种类型的引号(单引号、双引号、三引号)
- dcdc升压计算器excel_DC-DC升降压芯片(MC34063A/33063)典型电路与元件参数在线计算_三贝计算网_23bei.com...
- Java面向对象练习题之定义交通工具类型,控制速度
- 高效非支配排序ENS python版
- JSP文件过大编译失败 异常is exceeding the 65535 bytes limit错误
- 青蛙的约会—POJ1061
- 黑白双轨棋·改编(定子棋,终盘换子,在计算赢子的多少)
- echarts地图设置区块点击后颜色不改变
- ubuntu优化卸载不常用软件
- 治精神疾病不能光靠吃药,还要学会自救
- Unexpected exception parsing XML document from class path resource
- SVPWM控制技术+Matlab/Simulink仿真详解
- 华为招聘实习生~base深圳,坂田总部
- 程序员能力提升——7-2-1法则,让知识转化为职业竞争力
- MobileNet论文翻译
热门文章
- 忽略Java中的自签名证书
- linux开启防火墙ping,如何在防火墙中放开ping
- Java对象如何实现比较规则
- MySQL的explain工具介绍
- 按压缩格式整理打包(解包)和压缩(解压)命令
- python消息订阅_python实现发布订阅
- 网站服务器被访问 io,服务器端被客户端访问完以后出现java.io.ioexception,socket问题。...
- python如何读取文件内容求和_使用python对文件中的数值进行累加的实例
- 【音视频安卓开发 (四)】AndroidStudio项目配置权限、jni库路径、ABI
- FFmpeg options