今天学习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:递归输出斐波那契数列相关推荐

  1. 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 ...

  2. python列表输出斐波那契数列_Python|运用列表求斐波那契数列

    问题描述 斐波那契数列,又称黄金分割数列,指的是这样一个数列:0.1.1.2.3.5.8.13.21.34.--.前两项相加等于第三项.求任意一项,通常可以用函数来解题.但我们今天用列表来解题. 解决 ...

  3. python递归求斐波那契数列前20项_Python 求斐波那契数列前20项和

    展开全部 定义:斐波那契数列2113(Fibonacci sequence),又称黄金分割数列,指的是5261这样一个数列:0.41021.1.2.3.5.8.13.21.34.--在数学上1653, ...

  4. 【Python】输出斐波那契数列

    def fib(n):if n==1 or n==2:return nelse:return fib(n-1) + fib(n-2) n = int(input('斐波那契数列的第n项:')) pri ...

  5. C++递归输出斐波那契数列

    /* 解题思路: an=an-2+an-1 */ #include <stdio.h> int fbnq(int n) {if (n <= 2)return 1; //n=1,2 返 ...

  6. 递归与递推 输出斐波拉契数列的前n项 python

    输出斐波拉契数列的前n项 python 递归与递推 文章目录 输出斐波拉契数列的前n项 python 题设 题解 题设 以下数列 0 1 1 2 3 5 8 13 21 - 被称为斐波纳契数列. 这个 ...

  7. Python输出斐波那契数列【递归、迭代】

    Python输出斐波那契数列[递归.迭代] 首先 斐波那契数列的定义是什么? 斐波那契数列指的是这样一个数列:0.1.1.2.3.5.8.13.21.34.--在数学上,斐波那契数列以如下被以递推的方 ...

  8. 用python输出斐波那契数列的前20项_python输出斐波那契数列

    如何用Python输出一个Fibonacci数列有时候觉得自己像个神经病.既纠结了自己,又打扰了别人. #python3def fibo(n): if n受辱时的唯一办法就是忽视它,不能忽视它,就藐视 ...

  9. 递归函数输出斐波那契数列-黄金分割数列-兔子数列(python)

    递归函数输出斐波那契数列-黄金分割数列-兔子数列(python) 斐波那契数列介绍 数学家莱昂纳 多·斐波那契(Leonardoda Fibonacci)以兔子繁殖为例子而引入,故又称为"兔 ...

最新文章

  1. Python自动化运维——系统进程管理模块
  2. 在java中使用JMH(Java Microbenchmark Harness)做性能测试
  3. matlab中double 和single数据类型的差别
  4. python123m与n的数学运算_python小白进阶之路三——循环结构入门练习+Random库练习...
  5. Redis教程:数据持久化
  6. [转载] Python中三种类型的引号(单引号、双引号、三引号)
  7. dcdc升压计算器excel_DC-DC升降压芯片(MC34063A/33063)典型电路与元件参数在线计算_三贝计算网_23bei.com...
  8. Java面向对象练习题之定义交通工具类型,控制速度
  9. 高效非支配排序ENS python版
  10. JSP文件过大编译失败 异常is exceeding the 65535 bytes limit错误
  11. 青蛙的约会—POJ1061
  12. 黑白双轨棋·改编(定子棋,终盘换子,在计算赢子的多少)
  13. echarts地图设置区块点击后颜色不改变
  14. ubuntu优化卸载不常用软件
  15. 治精神疾病不能光靠吃药,还要学会自救
  16. Unexpected exception parsing XML document from class path resource
  17. SVPWM控制技术+Matlab/Simulink仿真详解
  18. 华为招聘实习生~base深圳,坂田总部
  19. 程序员能力提升——7-2-1法则,让知识转化为职业竞争力
  20. MobileNet论文翻译

热门文章

  1. 忽略Java中的自签名证书
  2. linux开启防火墙ping,如何在防火墙中放开ping
  3. Java对象如何实现比较规则
  4. MySQL的explain工具介绍
  5. 按压缩格式整理打包(解包)和压缩(解压)命令
  6. python消息订阅_python实现发布订阅
  7. 网站服务器被访问 io,服务器端被客户端访问完以后出现java.io.ioexception,socket问题。...
  8. python如何读取文件内容求和_使用python对文件中的数值进行累加的实例
  9. 【音视频安卓开发 (四)】AndroidStudio项目配置权限、jni库路径、ABI
  10. FFmpeg options