- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
TheDataStructure
数据结构
第3章:栈和队列
递归算法设计
递归算法的设计
Ø递归思路是:
•把一个不好直接求解的“大问题”转化成若干个“子问题”来解决;
•再把“子问题”进一步分解(递归体)成更小的“子问题”来解决;
•直至每个“子问题”都能直接解决(递归结束条件)。其中要保证
“大问题”与“子问题”相似,即求解过程与环境都相似。
递归体转换
递归模型C/C++语言函数
递归结束条件
递归算法的设计
Ø例如:
动物中有一种特殊的种类,它出生2天后就开始以每
天1只的速度繁殖后代。
假设第1天,有1只这样的动物(该动物刚出生,从第
3天开始繁殖后代)。那么到第11天,共有多少只呢?
递归算法的设计
Ø找规律:
•第1天1
•第2天1
•第3天2=1+1
•第4天3=1+2
•第5天5=2+3
•第6天8=3+5
•第7天13=5+8
•
递归算法的设计
Ø因此有如下公式:
longfibonacci(intday)
{
if(day==0)return0;
elseif((day==1||(day==2)return1;
elsereturn(fibonacci(day-1)+fibonacci(day-2));
}
Ø【递归算法的效率分析】更为简洁的写法:
longfib(intday)
{
returnday==0?0
((day==1||day=2)?1(fib(day-1)+fib(day-2));
}
fib(5)的计算过程:
Ø递归算法特性
优势
•它能使一个蕴含递归关系且结构复杂的程序简洁精炼,增加
可读性
•特别是在难于找到从边界到解的全过程的情况下,如果把问
题推进一步,其结果仍维持原问题的关系
劣势
•嵌套层次深,函数调用开销大
•重复计算
可将递归改写成非递归
递归算法转化为非递归算法
Ø两种方法:
•直接转化法
直接用循环结构的算法替代递归算法。
•间接转化法
用栈模拟系统的运行过程,通过分析只保存必须
保存的信息,从而用非递归算法替代递归算法。
递归算法转化为非递归算法
Ø用循环结构替代递归过程
斐波那契数列递归算法采用循环的非递归算法
longfibonacci(intn)
longfibonacci(intn){longi,n,t1=0,t2=1,sn=0;
{for(i=1;i=n;++i)
if(n==0)return0;{
elseif((n==1||(n==2)
文档评论(0)