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



    可以发现,每个月的兔子的对数为 1,1,2,3,5,8,13,
    因此,经过一个简单的分析,可以看出来,这道题就是考察的斐波那契数列的。

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=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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/348835.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

排序算法二:快速排序算法原理以及MATLAB与Python实现

今天继续学习排序算法。今天的主角是快速排序算法。 1. 快速排序基本原理 快速排序是C.R.A.Hoare于1962年提出的一种划分交换排序。它采用了一种分治的策略,通常称其为分治法(Divide-and-ConquerMethod)。 该方法的基本思想是: 1.先从数列…

排序算法三:堆排序基本原理以及Python实现

1. 基本原理 堆排序就是利用堆的特性进行一个无序序列的排序工作。 堆的特点 堆分为最大堆和最小堆,其实就是完全二叉树。 最大堆要求节点的元素都要不小于其孩子最小堆要求节点元素都不大于其左右孩子。 两者对左右孩子的大小关系不做任何要求,其实…

spring jms 消息_Spring JMS,消息自动转换,JMS模板

spring jms 消息在我的一个项目中,我应该创建一个消息路由器,就像所有路由器一样,它应该从一个主题获取JMS消息并将其放入另一个主题。 该消息本身是JMS文本消息,实际上包含XML消息。 收到消息后,我还应该添加一些其他…

排序算法四:归并排序基本原理以及Python实现

1. 基本原理 归并排序建立在归并操作上的一种算法。该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。归并排序是将两 个已经有序的序列合成一个有序的序列的过程。 因此,对于一个待排序的序列来说,首先要将其进行…

如何将JAR添加到Jetbrains MPS项目

Jetbrains MPS是创建DSL的绝佳工具。 我们喜欢它,并在我们的咨询工作中定期使用它。 因此,我们之前已经写过关于Jetbrains MPS的文章 。 作为投影编辑器,您可以轻松创建可通过图形界面或数学公式之类使用的DSL。 尽管所有这些功能都需要做一…

Python 3实现k-邻近算法以及 iris 数据集分类应用

前言 这个周基本在琢磨这个算法以及自己利用Python3 实现自主编程实现该算法。持续时间比较长,主要是Pyhton可能还不是很熟练,走了很多路,基本是一边写一边学。不过,总算是基本搞出来了。不多说,进入正题。 1. K-邻近…

UART原理

UART原理 通用异步收发传输器(Universal Asynchronous Receiver / Transmitter),通常称作UART,是一种异步收发传输器,是电脑硬件的一部分。将资料由串行通信与并行通信间作传输转换,作为并行输入成为串行输出的芯片&am…

AttributeError: module 'tensorflow' has no attribute 'placeholder'等一系列tensorflow版本导致的问题

新人tensorflow2.1版本导致程序我无法运行最简单的办法 法1 tensorflow.compat.v1 import tensorflow.compat..v1 as tf tf.disable_v2_behavior() 亲测不好用 法2 卸载2.1,安装老版本 在Terminal界面输入 pip uninstall tensorflow接着输入Y确定卸载。 安装t…

word中一直提示校对错误,如何关闭当前文档校对功能

关闭当前文档校对功能 文件>选项>校对>例外项,选中两个,如图 对比效果:

将测微仪与Spring Boot 2一起使用

这是快速入门,介绍了如何使用出色的Micrometer库来检测基于Spring Boot 2的应用程序并在Prometheus中记录指标 介绍 Micrometer在各种监视工具提供的客户端库上提供了基于Java的外观。 以Prometheus为例,如果我要将Java应用程序与Prometheus集成&#…

与Maven的集成测试

用Maven实施单元测试是很普通的事情,我们大多数人都熟悉项目结构以及单元测试所在的位置。 但是,集成测试是一种不同的情况,大多数情况下它们具有完全不同的要求。 例如,可以让您的单元测试在内存数据库中的h2上运行,…

通信原理-通信系统的组成

第一章 通信系统的组成 1、通信系统一般模型 发送设备:将信源产生的原始电信号变换成适合在信道中传输的形式。变换方式有调制、放大、滤波、编码、多路复用等。 信道:传输信号的通道.即传输媒质。在给子信号通道的同时,信道也会对信号产生损…

使用log4j2免费分配日志记录

介绍 最近,我正在为一个客户端工作,试图为大型精心制作的Java系统消除一些GC暂停。 经过分析后,我意识到大部分垃圾都是通过日志记录产生的! 是否有一种简单的方法来删除所有分配? 原来有:) 我应该使用哪个框架进行GC…

Verilog中fork...join 的用法

特点 中间的语句并行执行;(延时不累加) 不能用于综合; 代码 module signal_gen; reg wave; parameter cycle 5; initial beginforkwave 0;#(cycle) wave 1;#(2*cycle) wave 0;#(3*cycle) wave 1;#(4*cycle…

使用JWT的Cloud Native应用程序

本机云应用程序是为云计算环境开发的应用程序。 对于“ 什么是云原生应用程序 ”这个问题没有具体答案,但是必须满足不同的概念。 在我看来,最重要的功能之一就是能够快速缩放 。 这意味着我们的应用程序在每台服务器上都无法具有任何状态,…

开源项目GoodView点赞效果

点赞1效果: GoodView方法: 使用GoodView的Demo: public class MainActivity extends Activity { Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main)final Good…

开源RefreshListView下拉刷新效果

1、AnimationDrawable java.lang.Object ↳android.graphics.drawable.Drawable ↳android.graphics.drawable.DrawableContainer ↳android.graphics.drawable.AnimationDrawable 文档概述:An object used to create frame-by-frame animations, defined …

View的三大流程之View的测量

1、public class View extends Objectimplements Drawable.Callback KeyEvent.Callback AccessibilityEventSourcejava.lang.Object ↳android.view.View Class Overview This class represents the basic building block for user interface components. A View occupies a …

ListView的使用用ViewHolder提升效率

public class ListView extends AbsListViewjava.lang.Object ↳android.view.View ↳android.view.ViewGroup ↳android.widget.AdapterView<T extends android.widget.Adapter> ↳android.widget.AbsListView ↳android.widget.ListView Class Ove…

电脑还原Mac地址

之前修改过电脑Mac&#xff0c;现在与手机Mac冲突&#xff0c;导致手机无法连接校园网。 控制面板——》打开网络和共享中心——》选择更改适配器设置 本地连接——》右键选择属性 上图选择配置 高级——》在下拉菜单中选择网络地址——》右边选为“不存在” 之后本地连接会自…