Python算法100例-1.2 兔子产子

完整源代码项目地址,关注博主私信’源代码’后可获取

1.问题描述

有一对兔子,从出生后的第3个月起每个月都生一对兔子。小兔子长到第3个月后每个月又生一对兔子,假设所有的兔子都不死,问30个月内每个月的兔子总对数为多少?

2.问题分析

兔子产子问题是一个有趣的古典数学问题,我们画一张表来找一下兔子数的规律,如表1.1所示。

在这里插入图片描述

说明:不满1个月的兔子为小兔子,满1个月不满2个月的为中兔子,满3个月以上的为老兔子。

可以看出,每个月的兔子总数依次为1,1,2,3,5,8,13…这就是Fibonacci数列。总结数列规律即为从前两个月的兔子对数可以推出第3个月的兔子对数。

3.算法设计

本题目是典型的迭代循环,即是一个不断用新值取代变量的旧值,然后由变量旧值递推出变量新值的过程。这种迭代与这些因素有关:初值、迭代公式和迭代次数。经过问题分析,算法可以描述为

在这里插入图片描述

用Python语言来描述迭代公式即为fib=fib1+fib2,其中fib为当前新求出的兔子对数,fib1为前一个月的兔子对数,fib2为前两个月的兔子对数,然后为下一次迭代做准备,如图所示

在这里插入图片描述

进行如下的赋值fib2=fib1,fib1=fib,要注意赋值的次序;迭代次数由循环变量控制,为所求的月数。

4.完整的程序

根据上面的分析,编写程序如下:

%%time 
# 兔子产子问题if __name__=="__main__":fib1 = 1fib2 = 1i = 3# 输出第一个月和第二个月的兔子对数print("%6d       %6d" %(fib1, fib2), end="       ")while i <= 30:fib = fib1 + fib2                           # 迭代求出当前月份的兔子对数print("%6d" %fib, end="       ")            # 输出当前月份的兔子对数if i % 4 == 0:print()                                 # 每行输出4个fib2 = fib1                                 # 为下一次迭代做准备,求出新的fib2fib1 = fib                                  # 求出新的fib1i += 1
     1            1            2            3       5            8           13           21       34           55           89          144       233          377          610          987       1597         2584         4181         6765       10946        17711        28657        46368       75025       121393       196418       317811       
514229       832040       
CPU times: user 854 µs, sys: 970 µs, total: 1.82 ms
Wall time: 896 µs

6.问题拓展

这个程序虽然是正确的,但可以进行改进。目前用3个变量来求下一个月的兔子对数,其实可以在循环体中一次求出下两个月的兔子对数,这样就可以只用两个变量来实现。这里将fib1+fib2的结果不放在fib中而是放在fib1中,此时fib1不再代表前一个月的兔子对数,而是代表最新一个月的兔子对数,再执行fib2=fib1+fib2,由于此时fib1中已经是第3个月的兔子对数了,故fib2中就是第4个月的兔子对数。可以看出,此时fib1和fib2均为最近两个月的兔子对数,循环推出下两个月的兔子对数。改进后的程序如下:

%%time
# 兔子产子问题if __name__=="__main__":fib1 = 1fib2 = 1i = 1while i <= 15:     #每次求两个,因此循环变量循环到15print("%8d    %8d" %(fib1, fib2), end="      ")if i % 2 == 0:print()fib1 = fib1 + fib2                                  # 最新一个月的兔子对数fib2 = fib1 + fib2                                  # 第4个月的兔子对数i += 1
       1           1             2           3      5           8            13          21      34          55            89         144      233         377           610         987      1597        2584          4181        6765      10946       17711         28657       46368      75025      121393        196418      317811      514229      832040      CPU times: user 294 µs, sys: 0 ns, total: 294 µs
Wall time: 290 µs

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

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

相关文章

《Python 网络爬虫简易速速上手小册》第6章:Python 爬虫的优化策略(2024 最新版)

文章目录 6.1 提高爬虫的效率6.1.1 重点基础知识讲解6.1.2 重点案例&#xff1a;使用 asyncio 和 aiohttp 实现异步爬虫6.1.3 拓展案例 1&#xff1a;利用 Scrapy 的并发特性6.1.4 拓展案例 2&#xff1a;使用缓存来避免重复请求 6.2 处理大规模数据爬取6.2.1 重点基础知识讲解…

面试八股文(4)

文章目录 1.sleep和wait区别2.为什么调用start()方法会执行run()方法&#xff0c;为什么不能直接调用run()方法3.synchronized关键字4.并发编程的三个重要特性5.synchronized和volatile关键字区别6.ThreadLocal7.为什么要用线程池&#xff1f;8.实现Runnable接口和Callable接口…

vscode无法ssh远程连接到服务器:远程主机可能不符合 glibc 和 libstdc++ VS Code 服务器的先决条件

vscode无法ssh远程连接到服务器&#xff1a;远程主机可能不符合 glibc 和 libstdc VS Code 服务器的先决条件 今天vscode自动更新后无法连接到远程服务器了&#xff0c;提示"远程主机可能不符合 glibc 和 libstdc VS Code 服务器的先决条件" 并且命令窗口一直显示&qu…

【图论】基环树

基环树其实并不是树&#xff0c;是指有n个点n条边的图&#xff0c;我们知道n个点n-1条边的连通图是树&#xff0c;再加一条边就会形成一个环&#xff0c;所以基环树中一定有一个环&#xff0c;长下面这样&#xff1a; 由基环树可以引申出基环内向树和基环外向树 基环内向树如…

platfrom tree架构下实现3-Wire驱动(DS1302)

目录 概述 1 认识DS1302 1.1 DS1302 硬件电路 1.2 操作DS1302 1.3 注意要点 2 IO引脚位置 3 添加驱动节点 3.1 更新内核.dts 3.2 更新板卡.dtb 4 驱动程序实现 4.1 编写驱动程序 4.2 编写驱动程序的Makefile 4.3 安装驱动程序 5 验证驱动程序 5.1 编写测试程序…

AI-数学-高中-21-三角函数-cosx的图像与性质

原作者视频&#xff1a;三角函数】8cosx的图像与性质&#xff08;易中档&#xff09;_哔哩哔哩_bilibili cosx图像&#xff1a;就是sinx往左平移π/2的图像。 对称中心&#xff1a;找到一个点&#xff0c;翻转180度能跟自己重合。

QXlsx Qt操作excel

QXlsx 是一个用于处理Excel文件的开源C库。它允许你在你的C应用程序中读取和写入Microsoft Excel文件&#xff08;.xlsx格式&#xff09;。该库支持多种操作&#xff0c;包括创建新的工作簿、读取和写入单元格数据、格式化单元格、以及其他与Excel文件相关的功能。 支持跨平台…

Intellij IDEA各种调试+开发中常见bug

Intellij IDEA中使用好Debug&#xff0c;主要包括如下内容&#xff1a; 一、Debug开篇 ①、以Debug模式启动服务&#xff0c;左边的一个按钮则是以Run模式启动。在开发中&#xff0c;我一般会直接启动Debug模式&#xff0c;方便随时调试代码。 ②、断点&#xff1a;在左边行…

【日常总结】SourceTree 1.5.2.0 更换用户名称和密码

一、场景 二、问题 三、解决方案 > 方案一&#xff1a;删除缓存文件 > 方案二&#xff1a;更新最新版本&#xff0c;可以直接修改密码&#xff08;推荐&#xff09; 方案一&#xff1a;删除缓存文件 Stage 1&#xff1a;设置显示隐藏文件 Stage 2&#xff1a;打开…

一分钟了解电脑关机快捷键是什么!

在日常使用电脑的过程中&#xff0c;了解一些基本的快捷键是提高效率的关键之一。其中&#xff0c;电脑关机快捷键是一个方便且迅速的操作&#xff0c;使您可以在不用通过烦琐的菜单操作的情况下&#xff0c;快速关机电脑。在本文中&#xff0c;我们将探讨电脑关机快捷键是什么…

微信小程序使用ucharts折线图,有负数显示0刻度线

当数据有负数和正数的时候默认不会显示0刻度线&#xff0c;不方便看出正负对比 实现思路&#xff1a;显示的刻度线是根据数据的最大值和最小值自动分配到刻度线上面&#xff0c;把最大值和最小值设置为一样&#xff0c;然后平均分配给五个刻度线中间的刻度线就会为0就实现了显…

03-Java单例模式 ( Singleton Pattern )

单例模式 单例模式设计要点单例模式基础实现摘要实现范例 单例模式的几种实现方式1. 懒汉式&#xff0c;线程不安全2. 懒汉式&#xff0c;线程安全3. 饿汉式4. 双检锁/双重校验锁&#xff08;DCL&#xff0c;即 double-checked locking&#xff09;5. 登记式/静态内部类6. 枚举…