高级语言程序设计基础(CC++):函数与变量.ppt

高级语言程序设计基础(CC++):函数与变量.ppt

  1. 1、本文档共102页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
* 例15 汉诺塔问题 据说在约十九世纪末欧洲的商店中出售一种智力玩具,在一块铜板上有三根杆,最左边的杆上自上而下、由小到大顺序串着由 64 个圆盘构成的塔。 游戏的目的是将最左边A杆上的圆盘,借助最右边的C杆,全部移到中间的B杆上,条件是一次仅能移动一个盘,且不允许大盘放在小盘的上面。 64 片 初始杆 中间杆 目的杆 1 n 6 函数的递归调用 * 第1步,将问题简化。假设 A杆 上只有 2 个圆盘,即汉诺塔有 2 层,N=2。 A杆 C杆 B杆 移动方法:1. 将上面小片移到 C杆 上。 2. 将下面的大片由 A杆 移到 B杆 上。 3. 将 C杆 上的小片移到 B杆 上。 分析: 对A杆上的全部N个圆盘从小到大顺序编号,最小的圆盘为1号,次之为2号……则最下面的圆盘的编号为 N。 6 函数的递归调用 * A杆 C杆 B杆 第2步,对于一个有N(N1)个圆盘的汉诺塔,将N个圆盘分为两部分:上面的N-1个圆盘和最下面的 N号圆盘。将“上面的N-1个圆盘”看成一个整体。 第3步,为解决 N 个圆盘的汉诺塔,可按如下方式进行操作: ① 将A杆上面的N-1个盘子,借助B杆,移到C杆上; ② 将 A杆 上剩下的 N号 盘子移到 B杆 上; ③ 将 C杆 上的 N-1个 盘子,借助A杆,移到B杆上。 6 函数的递归调用 * 整理分析结果:把第1步中化简问题的条件作为递归 结束条件,将第3步分析得到的算法作为递归算法。 定义函数movedisc( n,fromneedle,toneedle,usingneedle)。 将 fromneedle 杆上的 N 个圆盘,借助 usingneedle 杆,移动到 toneedle 杆上。 6 函数的递归调用 * 移动N个圆盘的递归算法描述如下: movedisc ( n,fromneedle,toneedle,usingneedle ) { if ( n==1 ) 将 n 号圆盘从 fromneedle 上移到 toneedle; else { ① movedisc ( n-1,fromneedle,usingneedle,toneedle ) ② 将 n 号圆盘从 fromneedle 上移到 toneedle; ③ movedisc ( n-1,usingneedle,toneedle,fromneedle ) } } 6 函数的递归调用 * 程序 int i=0; /* 移动圆盘数量计数器 */ void main( ) { unsigned n; scanf (%d, n); movedisc ( n,’a’,’b’,’c’); /* 将A上的N个圆盘借助C将移动到B上 */ printf( \t Total: %d\n, i ); } void movedisc ( n, fromneedle, toneedle, usingneedle ) unsigned n; char fromneedle, toneedle, usingneedle; { if ( n == 1 ) printf(%2d-(%2d): %c == %c\n,++i, n,fromneedle,toneedle); else { movedisc ( n-1, fromneedle, usingneedle, toneedle ); printf(%2d-(%2d): %c == %c\n,++i, n,fromneedle,toneedle); movedisc ( n-1, usingneedle, toneedle, fromneedle ); } } 6 函数的递归调用 * 程序执行过程  当N=3时,程序递归调用的完整执行过程 在main函数中 递归调用第一层 递归调用第二层 递归调用第三层 递归 递归 ┎────→ move(1,a,b,c) ─→ 输出:1-(1):a==b ┃ ←─────── 返回递归第二层 ┃ 输出:2-(2):a==c 调用 ┃ move(1,b,c,a) ─→ 输出:3-(1):b==c ┎───→ move(2,

您可能关注的文档

文档评论(0)

学习让人进步 + 关注
实名认证
内容提供者

活到老,学到老!知识无价!

1亿VIP精品文档

相关文档