- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
第08 递归与搜索(上)
第8章 递归与搜索(上);第8章 递归与搜索;8.1 递归的基本思想;第②种表示方法,求n!时需要用到(n-1)!。如果有一个函数Factorial( int n )能实现求n的阶乘,则该函数在求n!时要使用到表达式:n*Factorial(n-1),Factorial(n-1)表示调用Factorial( )函数去求(n-1)!。具体代码例8.1。;int Factorial( int n )
{
if( n0 ) return -1;
else if( n==0 || n==1 ) return 1;
else return n*Factorial(n-1);
};假设要求3!,其完整的执行过程如图8.2所示,具体过程为:
①执行main函数的开头部分;
②当执行到Factorial函数调用“Factorial(3)”时,流程转而去执行Factorial(3)函数,并将实参3传递给形参n;
③执行Factorial(3)函数的开头部分;
④当执行到递归调用Factorial(n-1)函数时,此时n-1=2,所以要转而去执行Factorial(2)函数;
⑤执行Factorial(2)函数的开头部分;
⑥当执行到递归调用Factorial(n-1)函数时,此时n-1=1,所以要转而去执行Factorial(1)函数;;⑦执行Factorial(1)函数,此时因为n的值为1,所以返回1,而不是再递归调用下去,即,Factorial(1)函数执行完毕,返回到上一层,即返回Factorial(2)函数中;
⑧执行完Factorial(2)函数的剩余语句,返回到Factorial(3)函数中;
⑨执行完Factorial(3)函数的剩余语句,返回到main函数中;
⑩继续执行main函数的剩余部分直到整个程序执行完毕。;8.1.2 递归例题解析;用循环结构实现:
如果x1,x2表示前后两天吃完后剩下的桃子数,则有递推关系:x1 = (x2+1)*2。从第9天剩下1个桃子,反复递推9次,则可求第1天共摘下的桃子数。这里包含了反复的思想,可以用循环结构来实现,代码如下:;用递归思想实现:
前面所述的递推关系也可以采用下面的方式描述。假设第n天吃完后剩下的桃子数为A(n),第n+1天吃完后剩下的桃子数为A(n+1),则存在的推关系:A(n) = ( A(n+1) + 1 ) * 2。这种递推关系可以用递归函数实现,代码如下:;例8.3 采用递归思想递推Fibonacci数列中的每一项,并输出前20项的值。;例8.4 输入两个正整数,求其最大公约数;分析(continue):
例如,假设输入的两个正整数为18和33,则m = 33,n = 18。辗转相除法求最大公约数的过程如下图所示。;辗转相除法可以采用非递归的方法,即循环方法实现,如下面的代码:;辗转相除法的思想也可以采用递归方法实现。其递归思想是:在求最大公约数过程中,如果u对v取余的结果为0,则最大公约数就是v;否则递归求v和u%v的最大公约数。因此,上述代码中的gcd函数可改写成: ;A;3;思考:n个盘子至少需要移动多少步?比如n=64。;第一个人移动64个盘子(A—C)的过程:
命令第 2 个人将 63 个盘子从 A 移到B 上;
自己将剩余的最底下最大的那 1 个盘子从 A 移到 C 上;
再命令第 2 个人将 63 个盘子从 B 移到 C 上;
完成任务!; Answer :
递归的结束条件:
最后 1 个人(第 64 个人)只需要移动 1 个盘子。
注意:
第 1 个人完成任务的前提是:第 2 个人完成了任务
第 2 个人完成任务的前提是:第 3 个人完成了任务
……
第 63 个人完成任务的前提是:第 64 个人完成了任务
所以:
只有当第 64 个人完成任务后,第 63 个人才能完成任务;只有第 2~64 个人完成任务后,第 1 个人才能完成任务!
典型的递归问题!;3; 综上,便可得到移动 3 个盘子的步骤为
A—C
A—B
C—B
A—C
B—A
B—C
A—C;结论; 因此,将上面 3 个步骤分为 2 类操作:
将 n-1 个盘子从 1 个座移到另 1 个座上 (当 n1 时);
将最后 1 个盘子从 1 个座上移到另 1 个座上 。
设计程序
分别用 2 个函数实现以上 2 类操作:
设计 hanoi 函数实现第 1 类操作;
函数 hanoi( n, one, two, three ) 将实现把 n 个盘子从 one 座借助 two 座移到 three 座的过程;
设计 move 函数实现第 2 类操作;
函数 move( x, y ) 将实现把 1 个盘子从 x 座移到 y 座的过程。x 和 y
您可能关注的文档
最近下载
- TB-T 2491-1994 扣件组装疲劳试验方法.pdf VIP
- 短节段融合内固定治疗成人退变性脊柱侧凸并发症-中国骨与关节杂志.pdf VIP
- 2025年银行纪检笔试题目及答案.doc VIP
- 《企业经营决策讲义》课件.ppt VIP
- 中小学生牛奶配送项目 投标方案.docx
- 2024年贵州省黔东南苗族侗族自治州凯里市鸭塘镇招聘社区工作者真题及参考答案详解.docx VIP
- 样板工程验收记录.docx
- YY_T 0466.1-2023 医疗器械 用于制造商提供信息的符号 第1部分通用要求.pdf
- 七年级数学新课标下的单元教学设计实践研究.docx VIP
- 燃气发生器结构和系统详解.ppt VIP
文档评论(0)