- 1、本文档共18页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
(续)递归.ppt
算法设计与分析 计算机与信息学院 使用教材 使用教材 作者:(美)Anany Levitin 译者:潘彦 出版社:清华大学 丛书名:国外经典教材· 计算机 科学与技术 第 2 章’ 递 归 概述 递归程序的阅读理解 递归算法的设计实例 递归转非递归 概述 概述 设计方法:递归是一种重要的算法设计方法。 递归实现:自己调用自己(函数或子程序)。 解决问题:将问题转化为性质相同的子问题,达到问题求解的目的。 递归函数(或子程序)调用的内部过程 非递归调用示例: main() { …… ; A(8); //调用A函数 1; //下一条语句 …… ; } //------------------------ A(int k) //A函数实现 { …… } //函数体 主程序执行到A(8)语句时将调用函数A,指令流将进入 A 函数体执行(控制转移)其功能。控制转移前,需要保存现场: 1. 下一条语句的内存地址,便于 A函数执行完毕后返回,继续 执行后面的语句; 2. 函数实参值保存。以便与函数形参 k 结合,完成参数传递。 递归函数调用的内部过程 递归调用示例: main() { …… ; A(8,20); //函数调用 1; //下一条语句 …… ; } A(int k, int m) { …… ; A(k,m); //调用自己 2; //下一条语句 ……; } 参数保存:调用约定(混合语言编程) 1. 本示例有多个参数,那么这些实参用 什么样的数据结构来保存呢? 答: 栈 (LIFO: Last In First Out)。 2. 多个实参按什么顺序进栈呢? 答:这是不同编译系统的调用约定。 地址保存: 1. 嵌套(包括递归)调用需要保存多个 函数执行完毕后的返回地址,同样用 “栈”这种数据结构来保存。 2. 递归类似于循环,必须要有一个结束 条件(出口)。 递归程序的阅读理解 递归程序的阅读理解 算例1:求 m, n 最大公约数 算法 gcd(int m, int n) // 功能:求m, n最大公约数的欧氏递归版本 // 输入:两个不全为零的非负整数 m n // 输出:m, n 的最大公约数 { if ( n=0 ) //递归出口(结束条件) { write(m); } // 输出结果 else gcd(n, m mod n); // 形成递归,传递参数 } // 尾递归:递归是模块的最后一条语句 main() { gcd(100, 18); } 算法过程: (100,18)→(18,10)→(10,8)→(8,2)→(2,0) 递归程序的阅读理解(续1) 算例2:写出调用P(3)的运行结果 算法 P(int k) { if (k0) then { P(k-1); //形成递归,非尾递归 write(k); //输出 } } main() { P(3); } 运行结果:1 2 3 考虑: 1. 由于非尾递归,递归函数后面一条语句的地址需进栈保存; 2. 后面要用到变量k,因此 k 需进栈保存,否则 k 丢失。 如果递归深度很大, 有可能造成系统栈 溢出。 递归程序的阅读理解(续2) 算例3:写出调用P(3)的运行结果 算法 P(int k) { if (k0) then { P(k-1); //形成递归,非尾递归 write(k); //输出 P(k-1); } } main() { P(3); } 运行结果: 1 2 1 3 1 2 1 P(1) P(2) P(1) P(3) P(1) P(2) P(1) 递归算法实例1:n 阶汉诺塔游戏 递归算法的设计实例 实例1:n 阶汉诺塔游戏 有n个大小不同的盘子和3根木桩,初始状态如图所示。要求把所有盘子 从S移到G上,可借助A木桩。规定:每次只能移动一个盘子,且不能把 大盘子压在小盘子上面。求:n阶汉诺塔的移动次数。 n=5 4 3 2 1 递推过程分析: n=1: S(1) → G(1) n=2: S(1) → A(1); S(2) → G(2); A(1) → G(1,2); n=3: 3阶问题分解为:①原柱S目标柱A的2阶问题即S(1,2) → A(1,2); ② S(3) → G(3); ③原柱A目标柱G的2阶问题即A(1,2) → G(
文档评论(0)