专题讲座--非递归化(zsl).ppt





《专题讲座--非递归化(zsl).ppt》由会员分享,可在线阅读,更多相关《专题讲座--非递归化(zsl).ppt(29页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、主要内容主要内容什么时候使用递归什么时候使用递归递归分类递归分类递归模型递归模型递归算法的执行过程递归算法的执行过程递归算法的效率分析递归算法的效率分析递归算法的非递归化处理递归算法的非递归化处理一、什么时候使用递归?一、什么时候使用递归?1.问题的定义是递归的问题的定义是递归的 有许多数学公式、数列等的定义是递归的。例如有许多数学公式、数列等的定义是递归的。例如,求求n!和和Fibonacci数列等。这些问题的求解过程可以将其递归定义直接转数列等。这些问题的求解过程可以将其递归定义直接转化为对应的递归算法。化为对应的递归算法。例如:阶乘函数的定义例如:阶乘函数的定义 1 当当n=0时时 n!
2、=n*(n-1)*1 当当n0时时 1 当当n=0时时 n!=n*(n-1)!当当n0时时这时候递归的定义可以用如下的函数表示:1 当当n=0时时 f(n)=n*f(n-1)当当n0时时也就是说,函数f(n)的定义用到了自己本身f(n1)第一种递归阶乘的另外一种定义方法阶乘的另外一种定义方法有些数据结构是递归的。例如有些数据结构是递归的。例如,单链表就是一种递归数据结构单链表就是一种递归数据结构,其结点类型定义如其结点类型定义如下:下:typedef struct LNode ElemType data;struct LNode*next;LinkList;该定义中该定义中,结构体结构体LNo
3、de的定义中用到了它自身的定义中用到了它自身,即指即指针域针域next是一种指向自身类型的指针是一种指向自身类型的指针,所以它是一种递归所以它是一种递归数据结构。数据结构。2.数据结构是递归的数据结构是递归的第二种递归对对于于递递归归数数据据结结构构,采采用用递递归归的的方方法法编编写写算算法法既既方方便便又又有有效效。例例如如,求求一一个个不不带带头头结结点点的的单单链链表表head的的所有所有data域域(假设为假设为int型型)之和的递归算法如下:之和的递归算法如下:int Sum(LinkList*head)if(head=NULL)return 0;else return(head-
4、data+Sum(head-next);一个典型的例子是在一个典型的例子是在有序数组中有序数组中查找一个数据元素是否存在的查找一个数据元素是否存在的折半折半查找算法查找算法有序数组元素有序数组元素为为1 1;3 3;4;5;17;18;31;4;5;17;18;31;33;33;寻找值为寻找值为1717的的数据数据3.问题的求解方法是递归的问题的求解方法是递归的第三种递归典型的三种情况使用递归:问题的定义是递归的数据结构是递归的问题求解的过程是递归的直接递归:直接递归:函数直接调用本身。函数直接调用本身。A()A()CALL A()CALL A().间接递归:间接递归:一函数在调用其他函数时,
5、一函数在调用其他函数时,又产生了对自身的调用。又产生了对自身的调用。A()B()A()B()CALL B CALL B()()CALL ACALL A()()二、递归分类二、递归分类递递归归模模型型是是递递归归算算法法的的抽抽象象,它它反反映映一一个个递递归归问问题题的的递递归归结结构构,例例如如,前前面面的的递递归归算算法法对对应应的的递归模型如下:递归模型如下:fun(1)=1 (1)fun(n)=n*fun(n-1)n1 (2)其其中中,第第一一个个式式子子给给出出了了递递归归的的终终止止条条件件,第第二二个个式式子子给给出出了了fun(n)的的值值与与fun(n-1)的的值值之之间间的
6、的关关系系,第第一一个个式式子子称称为为递递归归出出口口,第第二二个个式式子称为子称为递归体递归体。三、递归模型三、递归模型l一般地一般地,一个递归模型是由一个递归模型是由递归出口递归出口和和递归体递归体两部分两部分组成组成,前者确定递归到何时结束前者确定递归到何时结束,后者确定递归求解时后者确定递归求解时的递推关系。的递推关系。l实际上递归的思路是把一个不能或者不好直接求解的实际上递归的思路是把一个不能或者不好直接求解的“大问题大问题”转化为一个或者几个转化为一个或者几个“小问题小问题”来解决;来解决;l再把再把“小问题小问题”进一步分解为更小的进一步分解为更小的“小问题小问题”来解来解决;
7、决;如此分解如此分解,直到,直到“小问题小问题”可以直接求解。可以直接求解。l递归模型的分解过程不是随意分解,分解问题规模要保证“大问题”和“小问题”的相似性,即求解过程和环境要具备相似性;l一旦遇到递归出口,分解过程结束,开始求值,分解是量变的过程,大问题慢慢变小,但是尚未解决,遇到递归遇到递归出口之后,发生了质变,即递归问题转化为直接问题。出口之后,发生了质变,即递归问题转化为直接问题。l因此,递归算法的执行总是分为分解和求值两个部分。l递归出口的一般格式如下递归出口的一般格式如下l f(s1)=m1l递归体的一般格式递归体的一般格式l f(sn)=g(f(sn-1),c)l递归的分解过程
8、递归的分解过程l递归求值的过程递归求值的过程l递归的求解的过程均有这样的特征:递归的求解的过程均有这样的特征:l先将先将整个问题整个问题划分为若干个划分为若干个子问题子问题,通过分别通过分别求解子问题求解子问题,最后最后获得整个问题的解。而这些子问题具有与原问题相同的求解方获得整个问题的解。而这些子问题具有与原问题相同的求解方法法,于是可以再将它们划分成若干个子问题于是可以再将它们划分成若干个子问题,分别求解分别求解,如此反复如此反复进行进行,直到不能再划分成子问题直到不能再划分成子问题,或已经可以求解为止。或已经可以求解为止。l这种这种自上而下将问题分解、求解自上而下将问题分解、求解,再再自
9、上而下引用、合并自上而下引用、合并,求出求出最后解答的过程称为最后解答的过程称为递归求解过程递归求解过程。这是一种。这是一种分而治之分而治之的算法的算法设计方法。设计方法。四、递归算法执行过程四、递归算法执行过程l以阶乘的递归计算为例llongFact(intn)llongf;lif(n0)printf(n0,inputerror);lelseif(n=0|n=1)f=1;lelsef=Fact(n-1)*n;lreturn(f);l执行过程分析执行过程分析递归算法执行过程总结递归算法执行过程总结u递归算法的执行过程是递归算法的执行过程是不断地自调用不断地自调用,直到到达递归出口才结束自调,直
10、到到达递归出口才结束自调用过程;用过程;u到达递归出口后,递归算法开始按到达递归出口后,递归算法开始按最后调用的过程最先返回最后调用的过程最先返回的次序返的次序返回;回;u返回到最外层的调用语句时递归算法执行过程结束。返回到最外层的调用语句时递归算法执行过程结束。五、递归算法的效率分析五、递归算法的效率分析斐波那契数列斐波那契数列Fib(nFib(n)的递归定义是:的递归定义是:求第求第n n项斐波那契数列的项斐波那契数列的递归函数递归函数如下:如下:long Fib(int n)if(n=0|n=1)return n;/递归出口递归出口 else return Fib(n-1)+Fib(n-
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 专题讲座 递归 zsl

限制150内