- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
递归法
递归法
设一个未知函数f,用其自身构成的已知函数g来定义:
f(n)=g(n,f(n-1)) n0
f(0)=a n=0
为了定义f(n),必须先定义f(n-1),为了定义f(n-1),又必须先定义f(n-2)…,上述这种用自身的简单情况来定义自己的方式称为递归定义。
一个递归定义必须是有确切含义的,也就是说,必须一步比一步简单,最后是有终结的,决不能无限循环下去。在f(n)的定义中,当n为0时定义一个已知数a,是最简单的情况,称为递归边界,它本身不再使用递归的定义。与递推一样,每一个递归定义都有其边界条件。但不同的是,递推是由边界条件出发,通过递推式求f(n)的值,从边界到求解的全过程十分清楚; 而递归则是从函数自身出发来达到边界条件。在通往边界条件的递归调用过程中,系统用堆栈把每次调用的中间结果(局部变量和返回地址值)保存在栈区,直至求出递归边界值f(0)=a。然后返回调用函数。返回过程中,中间结果相继出栈恢复,f(1)=g(1,a) → f(2)=g(2,f(1)) →…→ f(n)=g(n,f(n-1))为止。
描述递归定义的函数或求解递归问题的过程称为递归算法。一个递归算法,本质上是将较复杂的处理归结为简单处理,直到最简单的处理。从实际问题中抽象递归定义和边界条件的过程是一种归纳,通过这种归纳方式能使一个蕴含递归关系且结构复杂的程序简洁精炼,增加可读性。特别是在难于找到从边界到解的全过程的情况下,如果把问题推进一步,其结果仍维持原问题的关系,则采用递归算法编程比较合适。但递归算法也有致命的缺点,其执行的效率比较低,尤其在边界条边设置不当的情况,极有可能陷入死循环或者内存溢出的窘境。递归按其调用方式分
⑴直接递归──过程P直接自己调用自己;
⑵间接递归──即过程P调用一过程D,而过程D又调用过程P,即两个过程都通过另一过程调用它们自己,故称为间接递归;
由于人们通常使用直接递归方式编程,很少有人问津间接递归,因此这里主要介绍直接递归方式。递归算法适用的一般场合为:
1、数据的定义形式按递归定义。如裴波那数列的定义fn =fn-1 +fn-2 ,f0 =1,f1 =2。对应的递归程序为:
function fib(n:integer):integer;
begin
if n=0 then fib←1 {递归边界}
else if n=1 then fib←2
else fib←fib(n-2)+fib(n-1); {递归}
end;{fib}
这类递归问题可转化为递推算法,递归边界作为递推的边界条件。例如上例
f[0]←1;f[1]←2; {递推边界}
for i←2 to n do f[i]←f[i-1]+f[i-2];
fib←f(n);
2、数据之间的关系(即数据结构)按递归定义。如树的遍历,图的搜索等。
3、有些问题本身没有明显的递归结构,但使用递归求解比其它方法更简单。例如递归的分治策略
对于2、3,可利用堆栈结构将其转换为非递归算法,但结构不如递归算法简洁清晰,可读性较差。限于篇幅,这里不作介绍。编写递归程序时应注意解决如下几个问题:
⑴问题的递归定义,即如何用自身的简单情况定义自己;
⑵递归边界,即递归至哪个边界值后开始回溯;
⑶参与递归运算的变量有哪些,其中哪些作为值参,哪些作为局部变量。如果有全局变量参与递归运算的话(初始值由主程序传入,受内存限制不便作为值参),回溯过程中必须恢复其递归前状态;
【例题11.3.4】计算交点数
在平面上有n条直线,且无三线共点。问这些直线能有多少种不同的交点数。
输入:
n
输出:
以下若干行列出所有相交方案。其中一行为一个交点数。
分析:我们将n条直线排成一个序列。直线2与直线1最多有一个交点;直线3与直线1和直线2最多有2个交点,……,直线n与其它n-1条直线有n-1个交点。由此得出n条直线互不平行且无三线交于一点的最多交点数为1+2+…+(n-1)=。设
(0≤i≤)
我们来具体分析n=4的情况
⑴ 四条直线全
您可能关注的文档
最近下载
- 曲沃县各级文物保护单位一览表(2021版).docx VIP
- 2025年甘肃省公路交通建设集团武仙公路收费运营人员招聘61人简历怎么投递笔试备考题库及答案解析.docx VIP
- 2025年安徽省淮南市招聘社区工作者考试题(含答案).docx VIP
- 小学新学期开学收心会开学第一课收心主题班会通用PPT.pptx
- 做中文讲师妈妈.doc VIP
- 细胞的基本结构-细胞膜的结构和功能.ppt VIP
- 2025年初中语文九年级上册教学计划及进度表 .pdf VIP
- 部编版小学四年级语文上册教案(全册).pdf VIP
- 2025年甘肃省公路交通建设集团武仙公路收费运营人员招聘61人简历怎么投递笔试备考试题及答案解析.docx VIP
- 高中生物实验探究教学中的跨学科学习研究教学研究课题报告.docx
文档评论(0)