递归算法的理解和应用“兔子数列”.pptx
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
否则
,执行递归关系式
结构化程序设计方法中, 利用条件控制语句,实现“如果……否则……”的逻辑关系
结 论 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
求解“兔子数列”
——递归算法的理解和应用
一个数学问题
假定一对刚出生的兔子一个月就能长成大兔子,再过一 个月就开始生下一对小兔子,并且以后每个月都生一对 小兔子。
设所生一对兔子均为一雄一雌,且均无死亡。 中世纪 意大利数学家 问:一对刚出生的小兔一年内可以繁殖成多少对兔子?
斐波那契
从问题描述中获取有价值的信息
返回值
选择结构
主函数
void main( ) {
printf("%ld",F(12)); }
调用子函数
总结
本节内容结束,谢谢观看!
用数学符号表示:
1
n 1
F(n)
1
n 2
F(n 1) F(n 2) n 3
分段函数计算过程
F(11)
F(10)
第1是2否个需月要共计有算多F少(1只) 兔和子F(2?)呢? F(12)F(4 )=3 • F(1•1F) ( 3 )=2
F( 5 )=5
• F(10) • F( 9 )
• F( 4 )=3
一个函数直接或间接调用函数本身
结 论 1:
兔子问题(斐波那契数列) 蕴含着 递归关系
递归算法程序的特征
递归算法构成有两部分:
1)递归边界条件 2)递归关系式
递归算法执行分两阶段
1)递归前进阶段:不满足递归边界条件 2)递归返回阶段: 一旦满足递归边界条件后
递归算法的执行流程描述:
如果 满足边界条件,那么 递归关系式的值 = 确定值
F( 5 )
F(11)=89
• F( 4 ) • F( 3 )
• F(10)=55 • F( 9 )=34
F(4) F(12)=144
• F( 3 ) • F( 2 )
• F(11)=89 • F(10)=55
递归的核心思想
把大型复杂的问题层层转化为一个与原 问题相似的规模较小的问题来求解。
程序设计中的递归算法
F(n) =
1, 当n=1或n=2
F(n-1)+F(n-2), 当n>2
变量,将计算结 果返回给主调函 数
long F(int n)
子函数
{ long f; if( n==1 |||| nn====22 )
ff==11;;
else f=f=FF(n(n-1-)1+)F+F(n(n-2-)2;);
return f; }
(大兔子和小兔子)
推理:
第1月 第2月 第3月 第4月 第5月
第6月
推理:
月份
1月 2月 3月 4月 5月 6月 7月 8月 9月 10月 11月 12月
兔子数量
1 1 2 3 5 8 13 21 34 55 89 144
兔子数列——斐波那契数列
一个有规律的数列 第1项是1;第2项是1;从第3项开始,每一项都等于前两项之和。 1、1、2、3、5、8、13、21、34、55、89、144……
• F( 7 ) • F( 6 )
• F( 7 )=13
F( 9 )=34
• F( 6 ) • F( 5)
• F( 8 )=21
F(• 3F)(• =F7( )5F)=(52) + F(1• )F( 6 )= 8
•FF((73)=)1=3 2
FF(1(06)=)55 •• FF( (9 5)=3)4 •• FF( (8 4)=2)1
一对刚出生的兔子一个月就能长成 大兔子,再过一个月就开始生下一 对小兔Fra Baidu bibliotek,并且以后每个月都生一 对小兔子。
第一个月 只有一对小兔子
第二个月 只有一对大兔子
第三个月开始,每个月既有大兔子 也有小兔子
一对刚出生的小兔一年内可以繁 殖成多少对兔子?
求解问题:
初始条件:只有1对小兔子 求解目标:第12个月时,有多少兔子