- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
浅谈C语言递归算法
浅析C语言递归算法王浏江盐城师范学院 信息工程学院 计算机161班 摘要:递归算法,结构清晰,代码简练,函数调用灵活方便,比较容易理解和阅读。因此,递归算法一般用于多个相似小问题组成的一个复杂大问题。这种方法可以将复杂的问题简单化,使算法具有良好的阅读性。本文主要概述了递归算法的基本概念,实现递归的几个条件,直接递归和间接递归的分类,以及几个实例来解析C语言递归算法的执行过程。一递归的概念简单的说,递归就是一个程序自己调用自己本身的算法。概念程序调用自身的编程技巧称为递归(recursion)。递归做为一种算法在程序设计语言中广泛应用。递归就是用少量的代码将一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问题求解。一个过程或函数在其定义或说明中有直接或间接调用自身的一种方法,它只需少量的程序就可描述出解题过程所需要的多次重复计算,大大地减少了程序的代码量。递归的能力在于用有限的语句来定义对象的无限集合。一般来说,递归需要有边界条件、递归前进段和递归返回段。当边界条件不满足时,递归前进;当边界条件满足时,递归返回。成立的条件递归在程序设计中是一种重要的数据结构形态,通过递归程序的编写,在程序代码上会变得相当的简洁,如果设计不当时,会造成无穷循环或堆栈空间溢出的情况,所以递归函数在经过有限次调用之后必须得要有如:if()… return() 等边界约束条件,来退出递归,停止迭代,否则将是一个不断增大的死循环。递归算法所需条件:过程的描述中包含它自身。递归调用的次数必须有限。算法有边界约束条件。分类程序设计过程中,递归调用的方法有两种:直接递归调用和间接递归调用。如果一个程序a内部调用了a程序本身,这样的调用被称作为直接调用(例一)。如果两个平级程序a和b,程序a内部调用了程序b,而程序b内部也调用了程序a,这样的调用被称作为间接调用(例二)。如果两个嵌套关系的程序a和b,a程序中包含了b程序,程序b内部调用程序a,这样的调用同样也是属于间接调用(例三)。下面用图来表示这三个递归调用:二递归的本质调用机制在解决实际问题时,递归调用的实现和普通非递归的实现并没有多大的区别。递归的次数是由实际问题的性质所决定的,理论上说,“几次”“几百次”“几万次”都是差不多的,只是时间长短上的差异而已;但按实际而论,所占用的内存单元也是大相径庭的。函数调用时,通过压栈来实现函数之间的信息传递和控制转移。因此,系统将整个程序运行所需要的数据空间安排在一个栈中。每当调用一个函数时,就为其在栈顶分配一个内存空间,每当从一个函数退出时,就释放其内存空间,当前运行函数的数据区必在栈顶。一个递归函数的调用过程与多个函数的嵌套调用类似,只是调用函数与被调用函数是同一个而已。因此,递归函数调用的“层次数”成为一个重要的因素。每次调用递归函数程序的栈都会增长,而在未到达程序退出条件继续调用函数,则“层次数”会越来越大,内存的占用在很短的一段时间内急剧上升,某时刻可能会造成内存溢出,导致系统崩溃。当程序达到退出条件时开始返回,如果有返回值,上一步可以根据返回值完成该步骤的计算并返回其值到上上步,如果没有返回值则直接返回,直到完成各个递归最终跳出递归函数。递归算法的优缺点递归算法在解决很多复杂的实际问题时还是很方便的,它不仅代码简单明了,而且结构清晰,比较容易理解。但递归算法在实现时也会出现一些不可避免的问题,比如:内存空间溢出导致系统崩溃,时间、空间占用过多。递归算法每次在调用时都会重新生成变量,分配内存空间,导致了算法的运行效率下降。所以在必要的时候,可以使用非递归的方式采用递归的思想来解决。三递归的应用汉诺塔问题在创世纪时,Benare有一座波罗教塔,由三根钻石柱子支撑,神在第一根柱子上放置了64枚上小下大依次排列的金盘子,令门徒将所有的金盘子从第一根柱子可经第二根移至第三根柱子上.且搬运过程中遵守上小下大的原则,若每天只搬运一枚金盘子,当金盘子全部搬运完毕之时.此塔将会毁灭,就是世界末日来临之时。这就是汉诺塔问题的由来,它是递归的典型实例。假设这三个柱子名为A、B、C。(以四个盘子为例)要想将这四个盘子按顺序从A移动到C,首先得将上面三个盘子移动到B,这样才能使A上只有一个最大的,并且C上为空。而要使前三个盘子移动到B上,则前两个盘子必定得在C上,这样才能腾出一个B来给第三个盘子从A移动到B上。最后,既然前两个盘子在C上,必须满足第一个盘子在B上。(逆序思路)所以移动顺序为依次:(顺序移动)A-B//第一个放在B上A-C,B-C//前两个移动到C上A-B,C-A,C-B,A-B//前三个移动到B上A-C,B-C,B-A,C-A,B-C,A-B,A-C,B-C//四个盘子都在C上程序代码如下:#includestdio.hvoid move(char x,c
您可能关注的文档
最近下载
- 十八护理核心制度.doc VIP
- Unit3OurcultureourtresaureReading课件高中英语牛津译林版(2020)选修第三册3.pptx
- JJF(京)159-2025 水质在线电导率仪校准规范.pdf VIP
- GZ104 跨境电子商务赛题第5套-2024年全国职业院校技能大赛双数年拟设赛项赛题.pdf VIP
- 新22J10 无障碍设计.docx VIP
- 杨志人物介绍水浒传.pptx VIP
- 材料科学与工程基础》顾宜第四章课后答案.pptx VIP
- GZ104 跨境电子商务赛题第6套-2024年全国职业院校技能大赛双数年拟设赛项赛题.pdf VIP
- 《PDCA管理循环培训》课件.ppt VIP
- DGTJ08-2206-2024 建筑信息模型技术应用标准(人防工程).pdf VIP
文档评论(0)