四川大学计算机基础及C程序设计语言课件 递归函数设计.pptVIP

四川大学计算机基础及C程序设计语言课件 递归函数设计.ppt

  1. 1、本文档共26页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  5. 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  6. 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  7. 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  8. 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
6.3 递归及其实现 递归算法在可计算性理论中占有重要地位,是算法设计的有力工具,对于拓展编程思路非常有用。 任务6.5 用递归算法求n!。 算法思路: 定义函数 fact(n)=n! fact(n-1)=(n-1)! 则有fact(n)=n*fact(n-1) 通项公式 已知fact(1)=1 边界条件 任务6.5 算法思路(续) (1)或结点 结点依不同的条件会有不同的取值。 任务6.5 算法思路(续) (2)与结点 任务6.5 任务6.5 任务6.5 求n!的递归函数 int fact(int n) { if(n1) return n*fact(n-1); else return 1; } 任务6.5 任务6.5 使用递推求3! fact(1)=1 初始条件 fact(2)=2*fact(1)=2 fact(3)=3*fact(2)=6 int fact(int n) { int prod=1,I; for(I=1;I=n;I++) prod=prod*I; return prod; } 递推与递归的比较 递推的过程相当于从菜心推到外层,其出发点放在初始条件上。 递归的出发点放在求解的目标上,逐步调用本身,直到递归的边界条件为止。 当问题不能或不容易找到递推关系时,使用递归更符合人的思维方式,逻辑性强,函数的可读性好,易于理解。 6.3 递归及其实现 例6.1 汉诺塔问题:相传在古代印度的一座神庙中,有位僧人整天把3根柱子上的金盘倒来倒去,原来他是想把64个一个比一个小的金盘从一根柱子上移到另一根柱子上去。移动过程中恪守下述规则:每次只允许移动一只盘,且大盘不得摆在小盘上面,如下图。 汉诺塔问题 算法思路:从最简单的情况分析起 (1)在A柱上只有一只盘子,见下图,假定盘号为1,这时只需将该盘从A直接搬到C,一次完成,记为move 1 from A to C 汉诺塔问题 算法思路(续) (2)在A柱上只有两只盘子时, 将1号盘从A移至B,这是为了让2号盘能移动,记为“将1从A移至B” 将2号盘从A移至C, “将2从A移至C” 将1号盘从B移至C, “将1从B移至C” 汉诺塔问题 算法思路(续) (3)在A柱上有三只盘子时, 将盘1,2视为一个整体,移到B,记为move(2,A,C,B),意思是将上面的两个盘子作为整体从A借助C移到B 将3号盘从A移至C,即“将3从A移至C” 将1,2作为一个整体,从B移到C,记为move(2,B,A,C),意思是将上面的两个盘子作为整体,从B借助A移到C 汉诺塔问题 汉诺塔问题 (4)在将1、2号盘从A移至B的过程中,move(2,A,C,B)可分为如下3步: 将1从A移至C 将2从A移至B 将1从C移到B move(2,B,A,C)可分为如下3步: 将1从B移至A 将2从B移至C 将1从A移至C 汉诺塔问题 (5)将n次盘子从A移到C,可分为三步: 将1,2,3…n-1作为一个整体从A借助C移到B 将n从A移到C 将1,2,3…n-1作为一个整体从B借助A移到C 即 move(n,A,C,B)中需作如下操作: move(n-1,A,C,B) 将n从A移至C move(n-1,B,A,C) 汉诺塔问题 (6)定义函数move(n,A,B,C),用于将前n号盘子从A借助B移到C,由上面的分析知,搬移过程如下: 汉诺塔问题 (7)3个盘子的递归与或图 汉诺塔问题 函数实现(程序6_6.cpp) void move(int n,char A,char B,char C){ if(n==1) cout“将”n“从”A “移至”Cendl; else{ move(n-1,A,C,B); cout“将”n“从”A “移至”Cendl; move(n-1,B,A,C); } } 汉诺塔问题 汉诺塔问题 下面来看看移动n只盘子的总移动次数 设S(n)为移动n只盘子所需的移动次数,则 S(n)=2*S(n-1)+1 S(1)=1 由归纳法可得: S(n)=2n-1。 如果n=64,则S(n)=2^64-11019 如果僧人一秒移动一只盘子,则需5800亿年。 6.5 程序举例 例7:有一位糊涂人,他写了n封信和n个信封,到了邮寄的时候,把所有的信都装错了信封。设Dn为n封信装错信封可能的种类数,可以用下面的递归公式: 请编程计算Dn,n由键盘输入 例7 信封问题 (1) 使用递推:6_13.cpp int D(int n){ int i; int d1=1,d2=0,d=0; if(n==1) return d1; if(n==2) return d2; for(i=3;i=n;i++){ d

文档评论(0)

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

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

1亿VIP精品文档

相关文档