第29课 求解兔子数列
递归算法的理解和应用“兔子数列”.pptx

——递归算法的理解和应用
一个数学问题
假定一对刚出生的兔子一个月就能长成大兔子,再过一 个月就开始生下一对小兔子,并且以后每个月都生一对 小兔子。
设所生一对兔子均为一雄一雌,且均无死亡。 中世纪 意大利数学家 问:一对刚出生的小兔一年内可以繁殖成多少对兔子?
斐波那契
从问题描述中获取有价值的信息
一对刚出生的兔子一个月就能长成 大兔子,再过一个月就开始生下一 对小兔子,并且以后每个月都生一 对小兔子。
第一个月 只有一对小兔子
第二个月 只有一对大兔子
第三个月开始,每个月既有大兔子 也有小兔子
一对刚出生的小兔一年内可以繁 殖成多少对兔子?
求解问题:
初始条件:只有1对小兔子 求解目标:第12个月时,有多少兔子
否则
,执行递归关系式
结构化程序设计方法中, 利用条件控制语句,实现“如果……否则……”的逻辑关系
结 论 2:
用双分支选择结构(if……else……) 控制着 递归关系式
if
else
if( 递递归归边出界口条条件件 )
已知条件中,确定值的内容
else 递归关系式
关于“兔子问题”的递归程序实现
C语言程序实现:计算兔子数列问题
F( 6 )=8
• F( 9 ) • F( 8 )
• F( 5 )=5
• F(1•0F) ( 2 )=1
• F( 3 )=2
• F( 4 )=3
F( 8 )
F( 7 )
F(2)=1 ,根F(据1)=公1式计算F(12)的值 F( 9F()7 )=13 • F(• F8( )6 )=8
F( 8 )=21
返回值
选择结构
主函数
有趣的兔子数列

有趣的兔子数列(裴波那契)
裴波那契(Fibonacci leonardo,约1170-1250)是意大利著名数学家.在他的著作《算盘书》中许多有趣的问题,最富成功的问题是著名的“兔子繁殖问题”:如果每对兔子每月繁殖一对子兔,而子兔在出生后第二个月就有生殖能力,试问一对兔子一年能繁殖多少对兔子?可以这样思考:第一个月后即第二个月时,1对兔子变成了两对兔子,其中一对是它本身,另一对是它生下的幼兔.第三个月时两对兔子变成了三对,其中一对是最初的一对,另一对是它刚生下来的幼兔,第三对是幼兔长成的大兔子.第四个月时,三对兔子变成了五对,第五个月时,五对兔子变成了八对,按此方法推算,第六个月是13对兔子,第七个月是21对兔子……,裴波那契得到一个数列,人们将这个数列前面加上一项1,成为“裴波那契数列”,即:1,1,2,3,5,8,13….出人意料的是,这个数列在许多场合都会出现,在数学的许多不同分支中都能碰到它.世界上有关裴波那契数列的研究文献多得惊人,裴波那契数列不仅是在初等数学中引人入胜,而且它的理论已广泛应用,特别是在数列、运筹学及优化理论方面为数学家们展开了一片施展才华的广阔空间.。
斐波那契数列资料

斐波那契数列斐波那契数列一、简介斐波那契数列(Fibonacci),又称黄金分割数列,由数学家斐波那契最早以“兔子繁殖问题”引入,推动了数学的发展。
故斐波那契数列又称“兔子数列”。
斐波那契数列指这样的数列:1,1,2,3,5,8,13,……,前两个数的和等于后面一个数字。
这样我们可以得到一个递推式,记斐波那契数列的第i项为F i,则F i=F i-1+F i-2.兔子繁殖问题指设有一对新生的兔子,从第三个月开始他们每个月都生一对兔子,新生的兔子从第三个月开始又每个月生一对兔子。
按此规律,并假定兔子没有死亡,10个月后共有多少个兔子?这道题目通过找规律发现答案就是斐波那契数列,第n个月兔子的数量是斐波那契数列的第n项。
二、性质如果要了解斐波那契数列的性质,必然要先知道它的通项公式才能更简单的推导出一些定理。
那么下面我们就通过初等代数的待定系数法计算出通项公式。
令常数p,q满足F n-pF n-1=q(F n-1-pF n-2)。
则可得:F n-pF n-1=q(F n-1-pF n-2)=q2(F n-2-pF n-3)=…=q n-2(F2-pF1)又∵F n-pF n-1=q(F n-1-pF n-2)∴F n-pF n-1=qF n-1-pqF n-2F n-1+F n-2-pF n-1-qF n-1+pqF n-2=0(1-p-q)F n-1+(1+pq)F n-2=0∴p+q=1,pq=-1是其中的一种方程组∴F n-pF n-1= q n-2(F2-pF1)=q n-2(1-p)=q n-1F n=q n-1+pF n-1=q n-1+p(q n-2+p(q n-3+…))=q n-1+pq n-2+p2q n-3+…+p n-1不难看出,上式是一个以p/q为公比的等比数列。
将它用求和公式求和可以得到:而上面出现了方程组p+q=1,pq=-1,可以得到p(1-p)=-1,p2-p-1=0,这样就得到了一个标准的一元二次方程,配方得p2-p+0.25=1.25,(p-0.5)2=1.25,p=±√1.25+0.5。
兔子繁衍问题(斐波那契数列)

兔子繁衍问题(斐波那契数列)
一对兔子,从出生后第3个月起每个月都生一对兔子。小兔子长到第3个月后每个月又生一对兔子。假如兔子都不死,请问第1个月出生的一 对兔子,至少需要繁衍到第几个月时兔子总数才可以达到N对?
输入格式: 输入在一行中给出一个不超过10000的正整数N。
int N,month=1,i,number=1;
scanf("%d",&N);
int count [2];
while (number < N) {
i = month%2;
if (month &unt [i]=number;
continue;
// 也可在下面使用else语句,月份大于二时。
}
number = count[0] + count[1];
count[0] = count [1];
count[1] = number;
month ++; } printf("%d\n",month); return 0; }
输出格式: 在一行中输出兔子总数达到N最少需要的月数。 ————————————————
/* 列表说明关系
month 1 2 3 4 5 6 7 number 1 1 2 3 5 8 13
规律:第n个月的兔子数是n-2月+n-1月的兔子的和
*/
#include <stdio.h>
int main (){
斐波那契兔子问题数字规律

斐波那契兔子问题数字规律斐波那契兔子问题是一个经典的数学问题,在数列中兔子的繁殖规律呈现出一种有趣的数字规律。
斐波那契数列以0和1开始,后面的每一项都是前两项的和。
而斐波那契兔子问题则是将兔子的繁殖规律应用在现实生活中,探讨兔子的繁衍情况。
斐波那契兔子问题的数字规律可以通过以下方式来进行推导和解释。
1. 第一个月,兔子对数为1。
这是因为兔子开始繁殖,没有新生兔子加入,所以兔子的数量就是1。
2. 第二个月,兔子对数仍为1。
这是因为兔子繁殖一次需要一个月的时间,所以在第二个月的时候,还没有新生兔子加入,兔子的数量仍然是1。
3. 第三个月,兔子对数变为2。
这是因为第二个月的时候,已经有一对兔子繁殖出了一对新的兔子,所以兔子的数量变为2。
4. 第四个月,兔子对数变为3。
这是因为第三个月的时候,已经有两对兔子分别繁殖出了一对新的兔子,所以兔子的数量变为3。
5. 第五个月,兔子对数变为5。
这是因为第四个月的时候,已经有三对兔子分别繁殖出了两对新的兔子,所以兔子的数量变为5。
通过以上的推导,我们可以得到一个规律:每个月的兔子对数都是前两个月兔子对数之和。
这就是斐波那契兔子问题的数字规律。
斐波那契兔子问题的数字规律还有一些有趣的特点。
例如,兔子对数的增长速度是逐渐加快的。
在最开始的几个月,兔子对数的增长速度相对较慢,但随着时间的推移,增长速度越来越快。
这是因为随着兔子的数量增加,繁殖能力也随之增强,从而导致兔子对数的增长加速。
斐波那契兔子问题的数字规律还有一个有趣的特性:兔子对数的增长趋势呈现出一个近似黄金分割的比例。
黄金分割是指一条线段分为两部分,其中长部分与短部分的比例等于整体与长部分的比例相同。
在斐波那契兔子问题中,兔子对数的增长趋势也呈现出这种近似的黄金分割比例。
例如,前两个月兔子对数为1和1,比例为1:1;而后面的兔子对数依次为2、3、5,比例分别为1:2、2:3、3:5,逐渐接近黄金分割比例。
斐波那契兔子问题的数字规律在数学领域中有着广泛的应用。
斐波那契数列——兔子繁殖问题

斐波那契数列——兔⼦繁殖问题
⼜因以兔⼦繁殖为例⼦⽽引⼊,故⼜称为“”。
斐波那契数列⼀般⽽⾔,兔⼦在出⽣两个⽉后,就有繁殖能⼒,⼀对兔⼦每个⽉能⽣出⼀对来。
如果所有兔都不死,那么⼀年以后可以繁殖多少对兔⼦?
我们不妨拿新出⽣的⼀对⼩兔⼦分析⼀下:
第⼀个⽉⼩兔⼦没有繁殖能⼒,所以还是⼀对;
两个⽉后,⽣下⼀对⼩兔共有两对;
三个⽉以后,⽼兔⼦⼜⽣下⼀对,因为⼩兔⼦还没有繁殖能⼒,所以⼀共是三对;
---依次类推可以列出下表:经过⽉数:0,1,2,3,4,5,6,7,8,9,10,11,12
兔⼦:1,1,2,3,5,8,13,21,34,55,89,144,233
表中数字1,1,2,3,5,8---构成了⼀个。
这个数列有关⼗分明显的特点,那是:前⾯相邻两项之和,构成了后⼀项。
这个数列是意⼤利数学家在<全书>中提出的,这个级数的,除了具有a(n+2)=an+a(n+1)/的性质外,还可以证明通项公式为:an=1/√[(1+√5/2) n-(1-√5/2) n](n=1,2,3...)。
兔子数列

“兔子数列”和黄金分割点赵子尧假定一对刚出生的小兔一个月能长成大兔,再过一个月便能生下一对小兔,并且此后每个月都生一对小兔。
如果一切正常没有死亡,公母兔也比例适调,那么一对刚出生的兔子,一年可以繁殖成()对兔子。
A.144B.233C.288D.466【答案】B。
按照题干的条件,就是说兔子在出生两个月后,就有繁殖能力,一对兔子每个月能生出一对小兔子。
如果所有兔都不死,那么一年以后可以繁殖成多少对兔子?我们拿新出生的一对小兔子来推导一下:1个月后,小兔子仍没有繁殖能力,所以还是1对,但变成了大兔子;2个月后,生下一对小兔子,所以共有2对;3个月后,大兔子又继续生下1对小兔子,而此时小兔子变成大兔子,但还没有繁殖能力,所以一共是3对;依次类推我们可以列出下表:从上表中找寻数据之间的规律:小兔子对数=上个月大兔子对数大兔子对数=上个月大兔子对数+上个月小兔子对数总体对数=本月大兔子对数+本月小兔子对数通过上表,我们发现,经过0,1,2,3,……11,12个月后兔子的总数目,构成了这样一个数列:1,1,2,3,5,8,13,21,34,55,89,144,233...这个数列的特点非常明显,它的递推特征是从第三项开始,每项等于前两项数字之和,即2=1+1,3=1+2,5=2+3……以此类推。
这个数列就是意大利数学家斐波那契提出的著名的“斐波那契数列”,也就是传说中的“兔子数列”。
它的通项公式为:(1/√5)*{[(1+√5)/2]^n - [(1-√5)/2]^n}【√5表示根号5】很有趣的是:这样一个完全是自然数的数列,通项公式居然是用无理数来表达的。
兔子数列有很多奇妙的属性,比如:从第二项开始,每个奇数项的平方都比前后两项之积多1,每个偶数项的平方都比前后两项之积少1;随着数列项数的增加,前一项与后一项之比越逼近0.6180339887……,这不是一个循环小数,它是一个无理数,我们称之为黄金分割点,也叫黄金比。
求解兔子数列(课堂PPT)

(2)编写程序代码,将划线处填写完整 Function f(n As Integer) As Integer If n = 1 Then n=1 Else f=f(n-1)+f(n-2) End If End Function
12
授课人:杨鹏
高中信息技技术必修2:算法与程序设计
3
授课人:杨鹏
问题提出
高中信息技术必修2:算法与程序设计
兔子数列,是意大利数学家列昂纳多·斐波那契 (Leonardo Fibonacci)提出的,他以兔子繁殖为 例子而引入,故斐波那契数列又称为“兔子数列”。
一般而言,兔子在出生两个月后,就有繁殖能
力,一对兔子每个月能生出一对小兔子来。并且如 果所有兔都不死,那么一年以后可以繁殖多少对兔 子?
第29课 求解兔子数列
授课人:1 杨鹏
高中信息技术必修2:算法与程序设计
1.兔子数列。如果兔子在出生两 个月后,就有繁殖能力,一 对兔子每个月能生出一对小 兔子来。并且如果所有兔都 不死,那么一年以后可以繁 殖多少对兔子?
2.小猴吃桃。有一天小猴子摘若 干个桃子,当即吃了一半还觉 得不过瘾,又多吃了一个。第 二天接着吃剩下桃子中的一 半,仍觉得不过瘾又多吃了 一个,以后小猴子都是吃尚 存桃子一半多一个。到第10 天早上小猴子再去吃桃子的 时候,看到只剩下一个桃子。 问小猴子第一天共摘下了多 少个桃子?
7
授课人:杨鹏
高中信息技术必修2:算法与程序设计
(2)算法分析 Function 有多少对兔子(第几月) 如果是第一月或第二月,那么就有一对兔子。 否则,(本月)兔子数=(本月-1)月的兔子 数+(本月-2)月的兔子数 End Function
8
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
复习引入
高中信息技术必修2:算法与程序设计
递归算法的基本思想是把规模较大的、较难解 决的问题变成规模较小的、容易解决的同一 问题,规模较小的问题又变成规模更小的问 题 ,当问题小到一定程度时,可以直接得出 它的解,从而得到原来问题的解。即采用 “大事化小、小事化了”的基本思想。 采用递归算法的条件: (1)每一步骤解决问题的方法要一致; )每一步骤解决问题的方法要一致; (2)必须有一个明确的递归结束条件,称 )必须有一个明确的递归结束条件, 为递归出口。 为递归出口。
授课人: 授课人:杨鹏
高中信息技术必修2:算法与程序设计
分析这个数列,因为从第2个月开始,每月的 兔子总数目等于前2个月的兔子总数之和, 因此“兔子问题”很容易用递推式解决。假 设第n个月的兔子数目是F(n),有: f(n)=f(n-1)+f(n-2) (n≥3) f(1)=f(2)=1 (n=1或n=2) 在解决有些问题时,从初始条件入手,需要 一步步地按递推关系式递推,直至求出最终 结果,这种方法叫做递推或迭代法求解。
授课人: 授课人:杨鹏
高中信息技术必修2:算法与程序设计
(2)算法分析 Function 有多少对兔子(第几月) 如果是第一月或第二月,那么就有一对兔子。 否则,(本月)兔子数=(本月-1)月的兔子 数+(本月-2)月的兔子数 End Function
授课人: 授课人:杨鹏
高中信息技术必修2:算法与程序设计
高中信息技术必修2:算法与程序设计
授课人: 授课人:杨鹏
高中信息技术必修2:算法与程序设计
授课人: 授课人:杨鹏
高中信息技术必修2:算法与程序设计
授课人: 授课人:杨鹏
高中信息技术必修2:算法与程序设计
授课人: 授课人:杨鹏
授课人: 授课人:杨鹏
问题提出
高中信息技术必修2:算法与程序设计
兔子数列,是意大利数学家列昂纳多·斐波那契 (Leonardo Fibonacci)提出的,他以兔子繁殖为 例子而引入,故斐波那契数列又称为“兔子数列”。 一般而言,兔子在出生两个月后,就有繁殖能 力,一对兔子每个月能生出一对小兔子来。并且如 果所有兔都不死,那么一年以后可以繁殖多少对兔 子? 我们不妨拿新出生的一对小兔子分析一下: 第一个月小兔子没有繁殖能力,所以还是一对; 两个月后,生下一对小兔民数共有两对; 三个月以后,老兔子又生下一对,因为小兔子 还没有繁殖能力,所以一共是三对; ……
(3)编写程序代码。 Function f(n As Integer) As Long If n = 1 OR n=2 Then f = 1 '当n=1或n=2时,函数f的返回值为1 Else f = f(n-1)+f(n-2) '递归地调用函数f来计算f(n)的值 End If End Function (4)运行调试程序 根据算法流程图,填空完善已经设计好的界面和 部分代码的求n阶乘算法,并进行调试。
授课人: 授课人:杨鹏
高中信息技术必修2:算法与程序设计
(2)算法描述 function 有多少桃子(第几天) 如果是第10天,那么就有一个桃子。 否则,桃子数=2*(后一天的桃子数+1) end function (3)编写程序代码,将划线处填写完整 Function tao(days As Integer) As Integer If days = 10 Then tao = 1 Else tao=2*(tao(days+1)+1) End If End Function (4)运行调试程序 根据算法流程图,填空完善已经设计好的界面和部分代码的 求n阶乘算法,并进行调试。
授课人: 授课人:杨鹏
高中信息技术必修2:算法与程序设计
2.走台阶问题。从楼下到楼上共有n个台阶,每一步有2种走法: 走1个台阶;走2个台阶。走上这n个台阶共有多少种走法? (1)算法分析: 仅有1级台阶,走法有1种; 有2级台阶时,走法有2种; 有3级台阶时,走法有3种; 有4级台阶时,走法有5种; 有5级台阶时,走法有8种; 5 8 …… 有n级台阶时,走法有f(n-1)+f(n-2)种。其中f(n)为走上n个台 阶的走法数。 (2)编写程序代码,将划线处填写完整 Function f(n As Integer) As Integer If n = 1 Then n=1 Else f=f(n-1)+f(n-2) End If End Function
授课人: 授课人:杨鹏
课堂练习
高中信息技术必修2:算法与程序设计
1.小猴吃桃问题:有一天小猴子摘若干个桃子,当即吃了一半还 觉得不过瘾,又多吃了一个。第二天接着吃剩下桃子中的一 半,仍觉得不过瘾又多吃了一个,以后小猴子都是吃尚存桃 子一半多一个。到第10天早上小猴子再去吃桃子的时候, 看到只剩下一个桃子。问小猴子第一天共摘下了多少个桃子? (1)算法分析 假设第n天的桃子数是A(n) A(10)=1 A(9)=2*(A(10)+1) A(8)=2*(A(9)+1) …… A(n)=2*(A(n+1)+1) (2)写出递归表达式 A(n)=2*(A(n+1)+1) (n<10) A(10)=1 (n=10)
第29课 求解兔子数列 课
授课人: 授课人:杨鹏
高中信息技术必修2:算法与程序设计
1.兔子数列。如果兔子在出生两 个月后,就有繁殖能力,一 对兔子每个月能生出一对小 兔子来。并且如果所有兔都 不死,那么一年以后可以繁 殖多少对兔子? 2.小猴吃桃。有一天小猴子摘若 干个桃子,当即吃了一半还觉 得不过瘾,又多吃了一个。第 二天接着吃剩下桃子中的一 半,仍觉得不过瘾又多吃了 一个,以后小猴子都是吃尚 存桃子一半多一个。到第10 天早上小猴子再去吃桃子的 时候,看到只剩下一个桃子。 问小猴子第一天共摘下了多 少个桃子?
授课人: 授课人:杨鹏
高中信息技术必修2:算法与程序设计
授课人: 授课人:杨鹏
高中信息技术必修2:算法与程序设计
依次类推可以列出下表:
月份 兔子对数
1 1
2 1
3 2
4 3
5 5
6 8
7 13
8 21
9 34
10 55
11 89
12 144
这样一个数列1,1,2,3,5,8,13,21…… 就是 兔子数列。该数列有很多奇妙的属性: ①这个数列从第三项开始,每一项都等于前两项之和; ②随着数列项数的增加,前一项与后一项之比越逼近 黄金分割0.6180339887……; ③从第二项开始,每个奇数项的平方都比前后两项之 积多1,每个偶数项的平方都比前后两项之积少1;
授课人: 授课人:杨鹏
高中信息技术必修2:算法与程序设计
授课人: 授课人:杨鹏
高中信息技术必修2:算法与程序设计
授课人: 授课人:杨鹏
高中信息技术必修2:算法与程序设计
授课人: 授课人:杨鹏
高中信息技术必修2:算法与程序设计
Hale Waihona Puke 授课人: 授课人:杨鹏高中信息技术必修2:算法与程序设计
授课人: 授课人:杨鹏