书签 分享 收藏 举报 版权申诉 / 23
上传文档赚钱

类型第6章 递归算法课件2.ppt

  • 上传人(卖家):晟晟文业
  • 文档编号:4734067
  • 上传时间:2023-01-05
  • 格式:PPT
  • 页数:23
  • 大小:1.18MB
  • 【下载声明】
    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 对于第一种情况,可以直接选用循环结构对于第一种情况,可以直接选用循环结构的算法。的算法。对于第二种情况,可以把递归算法转换成对于第二种情况,可以把递归算法转换成相应的非递归算法,此时有两种转换方法:一相应的非递归算法,此时有两种转换方法:一种方法是借助堆栈,用非递归算法形式化模拟种方法是借助堆栈,用非递归算法形式化模拟递归算法的执行过程;另一种方法是根据要求递归算法的执行过程;另一种方法是根据要求解问题的特点,设计借助堆栈的

    8、循环结构算法。解问题的特点,设计借助堆栈的循环结构算法。这两种方法都需要使用堆栈,这是因为堆栈的这两种方法都需要使用堆栈,这是因为堆栈的后进先出特点正好和递归函数的运行特点相吻后进先出特点正好和递归函数的运行特点相吻合。合。通常,一个递归算法的模拟算法的复杂度通常,一个递归算法的模拟算法的复杂度与其本身的复杂度一样。与其本身的复杂度一样。96.7设计举例设计举例6.7.1 6.7.1 一般递归算法设计举例一般递归算法设计举例 例例6-5 6-5 设计一个输出如下形式数值的递归算法。设计一个输出如下形式数值的递归算法。n n n .nn n n .n.3 3 3 3 3 3 2 22 21 11

    9、0问题分析:该问题可以看成由两部分组成:一部分是输出一行值为n的数值;另一部分是原问题的子问题,其参数为n-1。当参数减到0时不再输出任何数据值,因此递归的出口是当参数n0时空语句返回。void Display(int n)int i;for(i=1;i 0)Display(n-1);/递归 /n=0为递归出口,递归出口为空语句 11例例6-6 设计求解委员会问题的算法。委员会问题是:设计求解委员会问题的算法。委员会问题是:从一个有从一个有n个人的团体中抽出个人的团体中抽出k(kn)个人组成一个委个人组成一个委员会,计算共有多少种构成方法。员会,计算共有多少种构成方法。问题分析:从问题分析:从

    10、n个人中抽出个人中抽出k(kn)个人的问题是一个个人的问题是一个组合问题。即求组合数公式组合问题。即求组合数公式C(n,k)。由于要所用递归。由于要所用递归算法算法,大家容易想到公式大家容易想到公式:C(n,k)=C(n-1,k-1)+C(n-1,k),这个公式大家可以这样理解这个公式大家可以这样理解:把把n个人固定位置个人固定位置后,从后,从n个人中抽出个人中抽出k个人的问题可分解为两部分个人的问题可分解为两部分之和:第一部分是第一个人包括在之和:第一部分是第一个人包括在k个人中,第二个人中,第二部分是第一个人不包括在部分是第一个人不包括在k个人中。个人中。对于第一部分,则问题简化为从对于第

    11、一部分,则问题简化为从n-1个人中抽个人中抽出出k-1个人的问题;对于第二部分,则问题简化为个人的问题;对于第二部分,则问题简化为从从n-1个人中抽出个人中抽出k个人的问题。个人的问题。13 当当n=k或或k=0时,该问题可直接求解,数值均为时,该问题可直接求解,数值均为1,这是算,这是算法的递归出口。因此,委员会问题的递推定义式为:法的递归出口。因此,委员会问题的递推定义式为:int Comm(int n,int k)if(n 1|k n)return 0;if(k=0)return 1;if(n=k)return 1;return Comm(n-1,k-1)+Comm(n-1,k);其它时

    12、当时当)1,-Comm(1)-1,-Comm(101),(Commknknknnkn15例例6-7 求两个正整数求两个正整数n和和m最大公约数的递推定义式为:最大公约数的递推定义式为:要求:要求:(1)编写求解该问题的递归算法;)编写求解该问题的递归算法;(2)分析当调用语句为)分析当调用语句为Gcd(30,4)时算法的执行过程和执时算法的执行过程和执行结果;行结果;(3)分析当调用语句为)分析当调用语句为Gcd(5,97)时算法的执行过程和执时算法的执行过程和执行结果;行结果;(4)编写求解该问题的循环结构算法。)编写求解该问题的循环结构算法。时当时当时当0)mod,(Gcd0),(Gcd)

    13、,(Gcdmmnmmnmnnmmn16解:(1)递归算法如下:int Gcd(int n,int m)if(n 0|m n)return Gcd(m,n);else return Gcd(m,n%m);17(2)调用语句为Gcd(30,4)时,因mn,递归调用Gcd(4,2);因mn,递归调用Gcd(97,5);因mn,递归调用Gcd(5,2);因mn,递归调用Gcd(2,1);因mn,递归调用Gcd(1,0);因m=0,到达递归出口,函数最终返回值为n=1,即5和97的最大公约数为1。18(4)循环结构算法循环结构算法int Gcd2(int n,int m)int tn,tm,temp;i

    14、f(n 0|m n)tn=m;tm=n;else tn=n;tm=m;While tm!=0 temp=tn;tn=tm;tm=temp%tm;return tn;196.7.2 6.7.2 回溯法及其设计举例回溯法及其设计举例 回溯法是递归算法的一种特殊形式,回溯法的回溯法是递归算法的一种特殊形式,回溯法的基本思想是:对一个包括有很多结点,每个结点有基本思想是:对一个包括有很多结点,每个结点有若干个搜索分支的问题,把原问题分解为对若干个若干个搜索分支的问题,把原问题分解为对若干个子问题求解的算法。当搜索到某个结点、发现无法子问题求解的算法。当搜索到某个结点、发现无法再继续搜索下去时,就让搜索

    15、过程回溯退到该结点再继续搜索下去时,就让搜索过程回溯退到该结点的前一结点,继续搜索这个结点的其他尚未搜索过的前一结点,继续搜索这个结点的其他尚未搜索过的分支;如果发现这个结点也无法再继续搜索下去的分支;如果发现这个结点也无法再继续搜索下去时,就让搜索过程回溯(即退回)到这个结点的前时,就让搜索过程回溯(即退回)到这个结点的前一结点继续这样的搜索过程;这样的搜索过程一直一结点继续这样的搜索过程;这样的搜索过程一直进行到搜索到问题的解或搜索完了全部可搜索分支进行到搜索到问题的解或搜索完了全部可搜索分支没有解存在为止。没有解存在为止。20 例6-10 设计求解迷宫问题的算法并用实际例子测试。算法如下:22 结构体如下:Typedef structint left;int forward;int right;InterSection;Typedef structint mazeSize;interSection*intSec;int Exit;6 0 2 0 3 5 6 0 0 4 0 0 0 0 0 0 7 0 0 723

    展开阅读全文
    提示  163文库所有资源均是用户自行上传分享,仅供网友学习交流,未经上传用户书面授权,请勿作他用。
    关于本文
    本文标题:第6章 递归算法课件2.ppt
    链接地址:https://www.163wenku.com/p-4734067.html

    Copyright@ 2017-2037 Www.163WenKu.Com  网站版权所有  |  资源地图   
    IPC备案号:蜀ICP备2021032737号  | 川公网安备 51099002000191号


    侵权投诉QQ:3464097650  资料上传QQ:3464097650
       


    【声明】本站为“文档C2C交易模式”,即用户上传的文档直接卖给(下载)用户,本站只是网络空间服务平台,本站所有原创文档下载所得归上传人所有,如您发现上传作品侵犯了您的版权,请立刻联系我们并提供证据,我们将在3个工作日内予以改正。

    163文库