第6章 递归算法课件2.ppt
- 【下载声明】
1. 本站全部试题类文档,若标题没写含答案,则无答案;标题注明含答案的文档,主观题也可能无答案。请谨慎下单,一旦售出,不予退换。
2. 本站全部PPT文档均不含视频和音频,PPT中出现的音频或视频标识(或文字)仅表示流程,实际无音频或视频文件。请谨慎下单,一旦售出,不予退换。
3. 本页资料《第6章 递归算法课件2.ppt》由用户(晟晟文业)主动上传,其收益全归该用户。163文库仅提供信息存储空间,仅对该用户上传内容的表现方式做保护处理,对上传内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知163文库(点击联系客服),我们立即给予删除!
4. 请根据预览情况,自愿下载本文。本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
5. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007及以上版本和PDF阅读器,压缩文件请下载最新的WinRAR软件解压。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 第6章 递归算法课件2 递归 算法 课件
- 资源描述:
-
1、第第6章章 递归算法递归算法2main()fn=Fact(3)Fact(3)y=Fact(2)return 3*yFact(2)y=Fact(1)return 2*y递归调用的执行过程:Fact(1)y=Fact(0)return 1*yFact(0)return 136.4递归过程和运行时栈递归过程和运行时栈 对于非递归函数,调用函数在调用被调用函对于非递归函数,调用函数在调用被调用函数前,系统要保存以下两类信息:数前,系统要保存以下两类信息:(1 1)调用函数的返回地址(从而能执行下一)调用函数的返回地址(从而能执行下一语句);语句);(2 2)调用函数的局部变量值。)调用函数的局部变量值
2、。当执行完被调用函数,返回调用函数前,系当执行完被调用函数,返回调用函数前,系统首先要恢复调用函数的局部变量值,然后返回统首先要恢复调用函数的局部变量值,然后返回调用函数的返回地址。调用函数的返回地址。递归函数被调用时,系统要做的工作和非递递归函数被调用时,系统要做的工作和非递归函数被调用时系统要作的工作在形式上类同,归函数被调用时系统要作的工作在形式上类同,但保存信息的内容和方法不同。但保存信息的内容和方法不同。4保存内容:保存内容:每一层递归调用所需要保存的信息构成一个工作记录,每一层递归调用所需要保存的信息构成一个工作记录,通常包括如下内容:通常包括如下内容:(1 1)本次递归调用中的局
3、部变量值;)本次递归调用中的局部变量值;(2 2)返回地址,即本次递归过程调用语句的后继语句)返回地址,即本次递归过程调用语句的后继语句的地址;的地址;(3 3)本次调用中与形参结合的实参值,包括函数名、)本次调用中与形参结合的实参值,包括函数名、引用参数与数值参数等。引用参数与数值参数等。5我们以计算阶乘的递归函数为例,说明递归函数调用我们以计算阶乘的递归函数为例,说明递归函数调用时运行时栈中工作记录的变化过程。时运行时栈中工作记录的变化过程。long Fact(int n)int x;long y;If n=0 return 1;else x=n-1;y=Fact(x);return n*
4、y;6 由于函数的地址是系统动态分配的,调用函数的返回地址因此也由于函数的地址是系统动态分配的,调用函数的返回地址因此也是动态变化的,不好给出具体数值,故下图中没有给出调用函数的是动态变化的,不好给出具体数值,故下图中没有给出调用函数的返回地址。返回地址。栈顶栈顶 3 2 1栈底栈底 0nxyFact初始时初始时运行时栈的变化过程 栈顶栈顶 321栈底栈底 03*nxyFact调用调用Fact(3)栈顶栈顶 3212*栈底栈底 032*nxyFact调用调用Fact(2)栈顶栈顶 321*121*栈底栈底 032*nxyFact调用调用Fact(1)栈顶栈顶 30*1210121*栈底栈底 0
5、32*nxyFact调用调用Fact(0)栈顶栈顶 321011121*栈底栈底 032*nxyFact返回返回Fact(0)栈顶栈顶 3212112栈底栈底 032*nxyFact返回返回Fact(1)栈顶栈顶 321栈底栈底 03226nxyFact返回返回Fact(2)栈顶栈顶 3 2 1栈底栈底 0nxyFact返回返回Fact(3)long Fact(int n)int x;long y;If n=0 return 1;else x=n-1;y=Fact(x);return n*y;76.6递归算法到非递归算法的转换递归算法到非递归算法的转换 有些问题需要用低级程序设计语言来实现,而
6、低级有些问题需要用低级程序设计语言来实现,而低级程序设计语言(如汇编语言)一般不支持递归,此时程序设计语言(如汇编语言)一般不支持递归,此时需要采用问题的非递归结构算法。一般来说,存在如需要采用问题的非递归结构算法。一般来说,存在如下两种情况的递归算法。下两种情况的递归算法。(1 1)存在不借助堆栈的循环结构的非递归算法,如)存在不借助堆栈的循环结构的非递归算法,如阶乘计算问题、斐波那契数列的计算问题、折半查找阶乘计算问题、斐波那契数列的计算问题、折半查找问题等。问题等。(2 2)存在借助堆栈的循环结构的非递归算法,所有)存在借助堆栈的循环结构的非递归算法,所有递归算法都可以借助堆栈转换成循环
7、结构的非递归算递归算法都可以借助堆栈转换成循环结构的非递归算法,如汉诺塔问题可以借助堆栈的循环结构实现非递法,如汉诺塔问题可以借助堆栈的循环结构实现非递归算法。归算法。8 对于第一种情况,可以直接选用循环结构对于第一种情况,可以直接选用循环结构的算法。的算法。对于第二种情况,可以把递归算法转换成对于第二种情况,可以把递归算法转换成相应的非递归算法,此时有两种转换方法:一相应的非递归算法,此时有两种转换方法:一种方法是借助堆栈,用非递归算法形式化模拟种方法是借助堆栈,用非递归算法形式化模拟递归算法的执行过程;另一种方法是根据要求递归算法的执行过程;另一种方法是根据要求解问题的特点,设计借助堆栈的
展开阅读全文