- 1、本文档共49页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
第三章 栈和队列 3.3 栈与递归的实现 递归实例 一个古老的故事: 从前有座山,山上有座庙,庙里有个老和尚在给小和尚讲故事, 讲的什么故事呢? 从前有座山,山上有座庙,庙里有个老和尚在给小和尚讲故事, ………… 套娃:俄罗斯民间工艺品 3.3 栈与递归的实现 想一想:递归的本质是什么? 自身对自身的调用 想一想:递归与迭代(递推)的区别是什么? 递归:自身调用自身——嵌套调用(使用选择结构) 若要求解问题n,需先求解问题n-1 迭代:返回值作为新的参数——循环求迭代变量值 利用n,求n+1 3.3 栈与递归的实现 简单递归算法举例 求n的阶乘 公式 写成递归函数有: Int fact(int n) { if (n==0) return 1; else return n*fact(n-1); } 迭代 Int fact(int n) { fac=1; for(i=1;i=n;i++) fac=i*fac; return fac; } 3.3 栈与递归的实现 递归算法的思想 要解决规模为n的问题,可通过解决规模为n-1的问题实现; 当问题规模为1(或某一确定值)时,问题直接可解。 该思想类似于数学归纳法思想。 3.3 栈与递归的实现 汉诺塔问题 3.3 栈与递归的实现 Step 1 3.3 栈与递归的实现 Step 2 3.3 栈与递归的实现 Setp3 3.3 栈与递归的实现 实现代码 void hanoi (int n, char x, char y, char z) //将塔座x上从小到大的编号为1-n的n个盘子,经y移到z。 { if (n = = 1) move (x, 1, z); else { hanoi(n-1, x, z, y); move(x, n, z); hanoi(n-1, y, x, z); } } 3.3 栈与递归的实现 函数调用的内部机制 函数A运行期间调用函数B之前要做的三件事: 将实参、返回地址传递给被调函数 为被调函数的局部变量分配存储区 将控制转移到被调函数入口地址 从被调函数B返回调用函数A之前要做的三件事: 保存被调函数计算结果 释放被调函数的数据区 依照被调函数保存的返回地址将控制转移至调用函数 3.3 栈与递归的实现 3.3 栈与递归的实现 3.3 栈与递归的实现 3.3 栈与递归的实现 3.3 栈与递归的实现 3.3 栈与递归的实现 当函数递归调用时 递归的层次 设调用递归函数的主函数为0层 每进行一次递归调用,层数增1 当开始从最内层函数返回时, 每返回一层,层数减1 后调用,先返回 递归工作栈 递归函数运行期间使用的数据存储区。 3.4 队列 日常生活中队列的例子 排队:先到先服务 回顾 3.4 队列 计算机中队列的例子 操作系统中的作业队列 网络打印机中的打印队列 媒体播放器的播放队列 3.4 队列 想一想:队列的本质特点是什么? 先进先出 First In First Out 一端只出,一端只入 3.4 队列 队列与栈的比较 相同点:都是线性表的特例 不同点: 队列: 先进先出; 两个出入口:一端只出,一端只入; 栈: 后进先出; 一个出入口:同一端入,同一端出。 3.4 队列 队列的抽象数据类型定义 ADT Queue { 数据对象:D = { ai | ai ∈ElemSet,i = 1, 2, …, n } 数据关系:R1 = { ai-1, ai ai-1, ai ∈D, i = 1, 2, …, n } 约定其中a1为队头,an为队尾。 3.4 队列 基本操作 InitQueue(Q) 构造一个空队列Q DestroyQueue(Q) 销毁队列Q ClearQueue(Q)清空队列Q QueueEmpty(Q)判断队列Q是否为空 QueueLength(Q)求队列长度 GetHead(Q,e)取队列头元素 EnQueue(Q,e)在队尾插入元素 DeQueue(Q,e)删除Q的队头元素 QueueTraverse(Q,visit()) 遍历队列元素 }ADT Queue 3
文档评论(0)