第08章 递归与搜索(上)(精品).ppt
《第08章 递归与搜索(上)(精品).ppt》由会员分享,可在线阅读,更多相关《第08章 递归与搜索(上)(精品).ppt(39页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、信息学院信息技术教研室程序设计方法及在线实践第8章 递归与搜索(上)2第8章 递归与搜索递归是一种重要的算法思想。递归既可以实现递推过程递推过程递推过程递推过程,也可以实现求解诸多问题的通用思路搜索搜索搜索搜索。38.1 递归的基本思想8.1.1 什么是递归在数学上,求n的阶乘,有两种表示方法:n n!=n(n-1)(n-2)21=n(n-1)(n-2)21 n n!=n(n-1)=n(n-1)!这两种表示方法实际上对应到两种不同的算法思想。第种表示方法中,求n!要反复把1、2、3、(n-2)、(n-1)、n累乘起来,是循环的思想,要用循环结构循环结构循环结构循环结构来实现,代码如下:int
2、n,F=1;scanf(%d,&n);for(i=1;i=n;i+)F=F*i;printf(%d的阶乘为%d,n,F);4第种表示方法,求n!时需要用到(n-1)!。如果有一个函数FactorialFactorial(intint n)n)能实现求n的阶乘,则该函数在求n!时要使用到表达式:n*Factorial(n-1)n*Factorial(n-1),Factorial(n-1)表示调用Factorial()函数去求(n-1)!。具体代码例8.1。例例例例8.1 8.1 递归求阶乘递归求阶乘递归求阶乘递归求阶乘#include int Factorial(int n)if(n0)retu
3、rn-1;else if(n=0|n=1)return 1;else return n*Factorial(n-1);/递归调用Factorial函数int main()int A;scanf(%d,&A);printf(%d!=%dn,A,Factorial(A);return 0;该程序的运行示例如下:该程序的运行示例如下:44!=245int Factorial(int n)if(n0)return-1;else if(n=0|n=1)return 1;else return n*Factorial(n-1);Factorial()函数有一个特点,它在执行过程中又调用了Factorial
4、()函数,这种函数称为递归函数递归函数递归函数递归函数。具体来说,在执行一个函数过程中,又直接或间接地调用该函数本身直接或间接地调用该函数本身直接或间接地调用该函数本身直接或间接地调用该函数本身,如图8.1所示,这种函数调用称为递归调用递归调用递归调用递归调用;包含递归调用的函数称为递归函数递归函数递归函数递归函数。6假设要求3!,其完整的执行过程如图8.2所示,具体过程为:执行mainmain函数的开头部分;当执行到Factorial函数调用“Factorial(3)Factorial(3)”时,流程转而去执行Factorial(3)Factorial(3)函数,并将实参3传递给形参n;执行
5、Factorial(3)Factorial(3)函数的开头部分;当执行到递归调用Factorial(n-1)函数时,此时n-1=2,所以要转而去执行Factorial(2)Factorial(2)函数;执行Factorial(2)Factorial(2)函数的开头部分;当执行到递归调用Factorial(n-1)函数时,此时n-1=1,所以要转而去执行Factorial(1)Factorial(1)函数;7执行Factorial(1)Factorial(1)函数,此时因为n的值为1,所以返回1,而不是再递归调用下去,即,Factorial(1)函数执行完毕,返回到上一层,即返回Factoria
6、l(2)Factorial(2)函数中;执行完Factorial(2)Factorial(2)函数的剩余语句,返回到Factorial(3)Factorial(3)函数中;执行完Factorial(3)Factorial(3)函数的剩余语句,返回到mainmain函数中;继续执行mainmain函数的剩余部分直到整个程序执行完毕。88.1.2 递归例题解析例例例例8.2 8.2 猴子吃桃问题猴子吃桃问题猴子吃桃问题猴子吃桃问题。猴子第1天摘下若干个桃子,当即吃了一半,还不过瘾,又多吃了一个。第2天早上又将剩下的桃子吃掉一半,又多吃了一个。以后每天早上都吃了前一天剩下的一半另加一个。到第10天早
7、上想再吃时,就只剩下一个桃子了。求第1天共摘了多少个桃子。分析:分析:分析:分析:假设Ai为第i天吃完后剩下的桃子的个数,A0A0表示第一天共摘下表示第一天共摘下表示第一天共摘下表示第一天共摘下的桃子的桃子的桃子的桃子,本题要求的是A0。有以下递推式子:A0=2(A1+1)A0=2(A1+1)A1:第1天吃完后剩下的桃子数A1=2(A2+1)A1=2(A2+1)A2:第2天吃完后剩下的桃子数A8=2(A9+1)A8=2(A9+1)A9:第9天吃完后剩下的桃子数A9=1A9=1以上递推过程可分别用循环结构循环结构循环结构循环结构和递归函数递归函数递归函数递归函数实现。9用循环结构实现:用循环结构
8、实现:用循环结构实现:用循环结构实现:如果x1,x2表示前后两天吃完后剩下的桃子数,则有递推关系:x1=(x2+1)*2x1=(x2+1)*2。从第9天剩下1个桃子,反复递推9次,则可求第1天共摘下的桃子数。这里包含了反复的思想,可以用循环结构来实现,代码如下:#include int main()int day,x1,x2;day=9;x2=1;while(day0)x1=(x2+1)*2;/第1天的桃子数是第2天桃子数加1后的2倍 x2=x1;day-;printf(total=%dn,x1);return 0;该程序的输出结果:该程序的输出结果:total=153410用递归思想实现:用
9、递归思想实现:用递归思想实现:用递归思想实现:前面所述的递推关系也可以采用下面的方式描述。假设第n天吃完后剩下的桃子数为A(n)A(n),第n+1天吃完后剩下的桃子数为A(n+1)A(n+1),则存在的推关系:A(n)=(A(n+1)+1)*2A(n)=(A(n+1)+1)*2。这种递推关系可以用递归函数实现,代码如下:#include int A(int n)if(n=9)return 1;else return(2*(A(n+1)+1);int main()printf(total=%dn,A(0);return 0;该程序的输出结果:该程序的输出结果:total=1534思考:思考:思考
10、:思考:以上递推关系式存在什么特点,为什么可以用递归函数实现?11例例例例8.3 8.3 采用递归思想递推Fibonacci数列中的每一项,并输出前20项的值。分析:分析:分析:分析:Fibonacci数列各项的递推关系是:F(n)=F(n-1)+F(n-2)F(n)=F(n-1)+F(n-2),这种递推关系式很适合适合适合适合用递归函数递归函数递归函数递归函数实现。代码如下:#include int Fibonacci(int n)if(n=0|n=1)return 1;else return(Fibonacci(n-1)+Fibonacci(n-2);void main()int i;in
11、t f20=0;for(i=0;i20;i+)/调用递归函数求每项 fi=Fibonacci(i);for(i=0;i20;i+)if(i%10=0)printf(n);/每行输出10个数据printf(%6d,fi);/每个数据占6个字符的宽度printf(n);该程序的输出结果:该程序的输出结果:(空一行)1 1 2 3 5 8 13 21 34 55 1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987 1597 2584 4181 6765 89 144 233 377 610 987 1597 2584 4181 676512例例例例8.4 8
12、.4 输入两个正整数,求其最大公约数分析:分析:分析:分析:数论中有一个求最大公约数的算法称为辗转相除法辗转相除法辗转相除法辗转相除法,又称欧几里德欧几里德欧几里德欧几里德(Euclid)Euclid)算法算法算法算法。其基本思想及执行过程为(设m为两正整数中较大者,n为较小者):(1)(1)令令令令u=mu=m,v=nv=n;(2)(2)取取取取u u对对对对v v的余数的余数的余数的余数,即r=u%v,如果如果如果如果r r的值为的值为的值为的值为0 0,则此时,则此时,则此时,则此时v v的值就是的值就是的值就是的值就是mm和和和和n n的的的的最大公约数最大公约数最大公约数最大公约数,
13、否则执行第(3)步;(3)(3)u=vu=v,v=rv=r,即即即即u u的值为的值为的值为的值为v v的值,的值,的值,的值,而而而而v v的值为余数的值为余数的值为余数的值为余数r r。并转向第并转向第并转向第并转向第(2)(2)步步步步。思考:思考:思考:思考:在初等数学里是如何求两个数的最大公约数?13分析分析分析分析(continue)continue):例如,假设输入的两个正整数为18和33,则m=33,n=18。辗辗辗辗转相除法转相除法转相除法转相除法求最大公约数的过程如下图所示。r=u%v=15u=v=18v=r=15r=u%v=3u=v=15v=r=3u=m=33v=n=18
14、因此18和33的最大公约数是v=3r=u%v=014辗转相除法可以采用非递归非递归非递归非递归的方法,即循环方法循环方法循环方法循环方法实现,如下面的代码:#include int gcd(int u,int v)/求u和v的最大公约数int r;while(r=u%v)!=0)u=v;v=r;return(v);int main()int m,n,t;printf(Please input two positive integers:);scanf(%d%d,&m,&n);if(mB(表示将 A柱 最上面的 1 个盘子移到 B柱 上)l AC(将 A 此时最上面的 1 个盘子移到 C 上)l
15、 BC(将 B 上的盘子移到 C 上)v 又如:移动 3 个盘子的情况,需要 7 步l AC l ABl CBl ACl BAl BCl AC思考:思考:思考:思考:请尝试写出当盘子数 n=5时具体的移动的步骤。18思考:思考:思考:思考:n个盘子至少需要移动多少步?比如n=64。现在我想不出移完64个盘子的步骤,但如果有另外一个人能想出怎样移完63个盘子,我只要移最后1个盘子就可以了!646362ABC12 646362ABC12 646362ABC12 646362ABC12 19第一个人移动64个盘子(AC)的过程:1.命令第 2 个人将 63 个盘子从 A 移到B 上;2.自己将剩余的
16、最底下最大的那 1 个盘子从 A 移到 C 上;3.再命令第 2 个人将 63 个盘子从 B 移到 C 上;4.完成任务!第2个人移动63个盘子(AB)的过程:1.命令第 3 个人将 62 个盘子从 A 移到C 上;2.自己将剩余的最底下最大的那 1 个盘子从 A 移到 B 上;3.再命令第 3 个人将 62 个盘子从 C 移到 B 上;4.完成任务!第第3个人移动个人移动62个盘子个盘子(AC)的过程:的过程:1.命令第命令第 4 个人将个人将 61 个盘子从个盘子从 A 移到移到B 上;上;2.自己将剩余的最底下最大的那自己将剩余的最底下最大的那 1 个盘子从个盘子从 A 移移到到 C 上
17、;上;3.再命令第再命令第 4 个人将个人将 61个盘子从个盘子从 B 移到移到 C 上;上;4.完成任务!完成任务!层层下放!递归调用!层层下放!递归调用!20 A Answer:nswer:v递归的结束条件:l 最后 1 个人(第 64 个人)只需要移动 1 个盘子。v 注意:l 第 1 个人完成任务的前提是:第 2 个人完成了任务l 第 2 个人完成任务的前提是:第 3 个人完成了任务l l 第 63 个人完成任务的前提是:第 64 个人完成了任务v 所以:l 只有当第 64 个人完成任务后,第 63 个人才能完成任务;只有第 264 个人完成任务后,第 1 个人才能完成任务!典型的递归
18、问题!思考:思考:思考:思考:递归的结束条件是什么?21321ABC32ABC13ABC213ABC21ABC231ABC213ABC213ABC213进一步分析:v 欲将 A 上 3 个盘子移到 C 上,用递归思想可以分解为以下 3 步:1)将 A 上 2 个盘子移到 B 上(借助 C)2)将 A 上 1 个盘子移到 C 上3)将 B 上 2 个盘子移到 C 上(借助 A)(其中,第 2 步可以直接实现。)l 第 1 步又可以用递归方法分解为:u 将 A 上 1 个盘子从 A 移到 C u 将 A 上 1 个盘子从 A 移到 B u 将 C 上 1 个盘子从 C 移到 Bl 第 3 步又可以
19、用递归方法分解为:u 将 B 上 1 个盘子从 B 移到 A u 将 B 上 1 个盘子从 B 移到 C u 将 A 上 1 个盘子从 A 移到 C22l 综上,便可得到移动 3 个盘子的步骤为u AC u ABu CBu ACu BAu BCu AC23结论v将 n 个盘子从 A 移到 C 可以分解为以下 3 个步骤:1)1)将将将将 A A 上上上上 n-1 n-1 个盘子借助个盘子借助个盘子借助个盘子借助 C C 先移到先移到先移到先移到 B B 上上上上;2)2)把把把把 A A 上剩下的上剩下的上剩下的上剩下的 1 1 个盘移到个盘移到个盘移到个盘移到 C C 上上上上;3)3)将将
20、将将 n-1 n-1 个盘从个盘从个盘从个盘从 B B 借助借助借助借助 A A 移到移到移到移到 C C 上上上上。v上面第 1 步和第 3 步,都是把 n-1 个盘子从 1 个座移到另 1 个座上,采用的办法是相同的,只是座的名字不同而已。为使之一般化,可以将第 1 步和第 3 步表示为:l将 one 座上 n-1 个盘子移到 two 座(借助 three 座)。l只是在第 1 步和第 3 步中,one、two、three 和 A、B、C 的对应关系不同。l对第 1 步,对应关系是:oneA,twoB,threeC。l对第 3 步,对应关系是:oneB,twoC,threeA。24v 因此
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 第08章 递归与搜索上精品 08 递归 搜索 精品
限制150内