3-1.5栈与递归.ppt
《3-1.5栈与递归.ppt》由会员分享,可在线阅读,更多相关《3-1.5栈与递归.ppt(44页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、数据结构与算法数据结构与算法For For 软件学院软件学院0909级本科生级本科生 2010-20112010-2011秋秋3.1.5 3.1.5 栈与递归栈与递归栈与递归递归概念递归概念函数调用与递归实现函数调用与递归实现递归调用过程剖析递归调用过程剖析2递归定义在定义一个过程或函数时出现调用本过程在定义一个过程或函数时出现调用本过程或本函数的成分或本函数的成分,称之为递归。称之为递归。若调用自身若调用自身,称之为直接递归。称之为直接递归。若过程或函数若过程或函数p p调用过程或函数调用过程或函数q,q,而而q q又调又调用用p,p,称之为间接递归。称之为间接递归。3递归定义常用来定义函数
2、和数列。例如,阶乘函数!可以按照以下的方式定义:根据这一定义,可以产生数列:1,1,2,6,24,120,720,5040,40320,362880,3628800,其中包括了数0、1、2、10、的阶乘。递归定义递归定义4另一个例子是下面的定义:会产生有理数序列:递归定义递归定义5序列的递归定义有一个不好的特性:为了确定序列中一个元素Sn的值,首先需要计算这个元素之前所有元素(S1、S2、Sn1)的值或其中一部分的值。例如计算3!的值需要首先计算0!、1!和2!的值。缺点:以迂回的方式进行计算。递归定义递归定义6等式比递归定义更可取,简化计算过程,不用计算第0、1、,n-1个元素的值,就可以计
3、算第n个元素的值。例如,序列g定义为:可以转化成较简单的等式:递归定义递归定义7以下三种情况常常用到递归方法。1 定义是递归的2 数据结构是递归的3 问题的解法是递归的81 1 定义是递归的定义是递归的求解阶乘函数的递归算法求解阶乘函数的递归算法long Factorial(long n)if(n=0)return 1;else return n*Factorial(n-1);例如,阶乘函数例如,阶乘函数9求解阶乘求解阶乘 n!的过程的过程10计算斐波那契数列的函数计算斐波那契数列的函数FibFib(n n)的定义的定义求解斐波那契数列的递归算法求解斐波那契数列的递归算法 long Fib(l
4、ong n)if(n=1)return n;else return Fib(n-1)+Fib(n-2);112 2 数据结构是递归的数据结构是递归的搜索链表最后一个结点并打印其数值搜索链表最后一个结点并打印其数值template void Find(ListNode*f)if(f link=NULL)cout f data endl;else Find(f link);例如,单链表结构例如,单链表结构12template void Print(ListNode*f,Type&x)if(f!=NULL)if(f-data=x)cout-data-link,x);在链表中寻找等于给定值的结点并打印
5、其数值在链表中寻找等于给定值的结点并打印其数值13 有A,B,C三个塔座,A上套有n个直径不同的圆盘,按直径从小到大叠放,形如宝塔,编号1,2,3n。要求将n个圆盘从A移到C,叠放顺序不变,移动过程中遵循下列原则:v每次只能移一个圆盘;v圆盘可在三个塔座上任意移动;v任何时刻,每个塔座上不能将大盘压到小盘上。3 3 问题解法是递归的问题解法是递归的Tower of Hanoi问题ABC14解决方法:n=1时,直接把圆盘从A移到C。n1时把上面n-1个圆盘从A移到B然后将n号盘从A移到C将n-1个盘从B移到C。即把求解n个圆盘的Hanoi问题转化为求解n-1个圆盘的Hanoi问题,依次类推,直至
6、转化成只有一个圆盘的Hanoi问题。ABC15递归过程与递归工作栈递归过程与递归工作栈递归过程在实现时,需要自己调用自己。每一次递归调用时,需要为过程中使用的参数、局部变量等另外分配存储空间。层层向下递归,退出时的次序正好相反:递归次序 n!(n-1)!(n-2)!1!0!=1 返回次序因此,每层递归调用需分配的空间形成递归工作记录,按后进先出的栈组织。16r主主程程序序srrrs子子过过程程1rst子子过过程程2rst子子过过程程317递归函数的实现递归函数的实现栈的一个最为广泛的应用对用户而言透明:程序运行环境所提供的函数调用机制运行时环境:目标计算机上用来管理存储器并保存执行过程所需的信
7、息的寄存器及存储器的结构函数调用静态分配:(在非递归)数据区的分配可以在程序运行前进行,直到整个程序运行结束才释放。采用静态分配时,函数的调用和返回处理比较简单,不需要每次分配和释放被调函数的数据区动态分配:在递归调用的情况下,被调函数的局部变量不能静态地分配某些固定单元,而须每调用一次就分配一份,以存放当前所使用的数据,当返回时随即释放。故其存储分配只能在执行调用时才能进行:在内存中开辟一个称为运行栈(runtime stack)的足够大的动态区18函数运行时的动态存储分配函数运行时的动态存储分配用作动态数据分配的存储区可按多种方式组织。典型的组织是将这个存储器分为栈(stack)区域和堆(
8、heap)区域栈区域用于分配发生在后进先出LIFO风格中的数据(诸如函数的调用)堆区域则用于不符合LIFO(诸如指针的分配)的动态分配19运行栈中的活动记录运行栈中的活动记录函数活动记录(activation record)是动态存储分配中一个重要的单元当调用或激活函数时,函数的活动记录包含了为其局部数据分配的存储空间 20运行栈中的活动记录运行栈中的活动记录运行栈随着程序执行时发生的调用链或生长或缩小每次调用一个函数时,执行进栈操作,把被调函数的活动信息压入栈中,即每个新的活动记录都分配在栈的顶部每次从函数返回时,执行出栈操作,释放本次的活动记录,恢复到上次调用所分配的数据区中被调函数中变量
9、地址全部采用相对于栈顶的相对地址来表示一个函数在运行栈中可有若干不同的活动记录,每个代表一个不同的调用对于递归函数来说,递归的深度就决定了其在运行栈中活动记录的数目当函数递归调用时,函数体的同一个局部变量,在不同的递归层次被分配给不同的存储空间,放在内部栈的不同位置21函数调用与返回处理函数调用与返回处理调用可以分解成以下三步来实现:调用函数发送调用信息。调用信息包括调用方要传送给被调方的信息,诸如实参、返回地址等分配被调方需要的局部数据区,用来存放被调方定义的局部变量、形参变量(存放实参)、返回地址等,并接受调用方传送来的调用信息调用方暂停,把计算控制转到被调方,亦即自动转移到被调用的函数的
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 1.5 递归
限制150内