第08 递归与搜索(上).pptVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 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

文档评论(0)

cgsx259 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档