C++教程ch5-3.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文档。上传文档
查看更多
C教程ch5-3

5.4 函数的递归调用 学而时习之,不亦乐乎? 解析: n=0时,n!=1; n=1时,n!= 1!=1(初始值) n1时,n!=n*(n-1)! (通项式) 数学递推式 递归函数 在执行函数 f 的过程中,又要调用 f 函数本身,称为函数的递归调用; 形式上:一个正在执行的函数调用了自身; 这种递归称之为直接递归 间接递归 函数体中没有直接调用自身函数,而是调用了另一个函数,在那个函数里,出现了调用本函数的语句 简单示例 例1:有4个人坐在一起,问第4个人多少岁?他说比第3个人大2岁。问第3个人岁数,他说比第2个人大2岁。问第2个人岁数,他说比第1个人大2岁。最后问第一个人,他说他是10岁。请问第4个人多大? 解析: age(4)=age(3)+2 age(3)=age(2)+2 age(2)=age(1)+2 age(1)=10 数学递推式: 程序实现 unsigned age (unsigned n) { if (n==1) return 10; else return age(n-1)+2; } void main() { cout“第4个人的年龄是: ”age(4); } 透过现象看本质 递归本质: 程序在运行中调用了相同代码 的函数 但每次调用时,在函数栈中必须重新复制 该函数的整套数据; 由于每套数据中的参数不同,导致了计算条件发生变化,使得函数得以逐步逼近终极目标而运行。 递归优点:简化程序设计,使程序易写易读 递归缺点:程序开销(调用时间开销、栈内存空间开销)比非递归程序大,性能降低 注意事项 函数中需要有使递归结束的条件。递归不能无限制地调用下去。 如: if (n==1) return 10; 递归函数应有参数,递归调用时参数值应逐渐逼近停止条件。 如: return age(n-1)+2; 递归条件应先测试,后递归调用。 if (n==1) return 10; else return age(n-1)+2; 典型应用-----汉诺塔问题 三个座A、B、C,开始时A上面套着64个圆盘,盘子大小不等,大的在下,小的在上。 任务:将所有圆盘从A座搬到C座上,移动过程中可以利用B座。但每次只允许移动一个盘,且在移动过程中在3个座上都始终保持大盘在下,小盘在上. 编程序打印出移动次数最少时的步骤。 经数学推导: 移动n个盘子至少需要经历2n-1步; 解决汉诺塔问题需要: 264-1=18446744073709551615 步 1秒钟移动一个盘子,需要约5849亿年 可以肯定地说:任何一个天才都不可能直接写出移动盘子的每一个具体步骤。 这是一个只有用递归才能解决的问题。 老和尚的解决办法: 命令第2个和尚将63个盘子从A座移到B座; 自己将1个盘子(最底下的、最大的盘子)从A座移到C座; 再命令第2个和尚将63个盘子从B座移到C座。 第二个和尚的解决方法: 命令第3个和尚将62个盘子从A座移到C座; 自己将1个盘子从A座移到B座; 再命令第3个和尚将62个盘子从C座移到B座。 简化分析 将A座上的3个盘子搬到C座的过程: 将A上的2个盘子先移到B座上(借助C座); 把A座剩下的1个盘移到C座上; 将B座上的2个盘移到C座上(借助A座)。 移动3个盘子的步骤: 方法归纳:(3步、2类操作) 将n个盘子从A座移到C座可以分解为以下3个步骤: 将A上的n-1个盘子借助C座先移到B座上; 把A座剩下的1个盘移到C座上; 将n-1个盘从B座借助于A座移到C座上。 两类操作: 将n-1个盘子从一个座移到另一个座上(n1); (这是大和尚指挥小和尚干的事,是一个层层下放的递归过程) 将1个盘子从一个座移到另一个座上。 (这是老和尚自己的事情) 运行结果演示 程序实现 用hanoi函数实现第1类操作(模拟小和尚的任务) 功能:将n个盘从第一个座借助第二个座移到第三个座 分析:需要四个参数,不需要返回值 原型:void hanoi(int n,char one,char two,char three); 用move函数实现第2类操作(模拟老和尚的任务) 功能:将1个盘从一个座直接移到另一个座 分析:需要二个参数,不需要返回值 原型:void move(char x, char y); 5.5 函数重载 意为可以对多个功能类似的函数使用相同的函数名。 重载目的 最基本的编程就是给变量和函数命名,在函数中编写一组操作,再以一定方式组织函数。 示例:求“二数较大者”的max函数 int max(int a, int b) { if (ab) return a; else return b; }

文档评论(0)

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

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

1亿VIP精品文档

相关文档