汉诺塔函数C++.docVIP

  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

汉诺塔问题 1.1. 问题描述 1.1.1 题目内容 用一个递归算法建立程序,实现汉诺塔问题的圆盘的移动。 1.1.2 基本要求 在这个汉诺塔问题中,假设有三个分别命名为A, B和C,在塔座 A上插有n 个直径大小各不同的圆盘。要求将A轴上的 n个圆盘移至塔座C上并任按同样顺序叠排,圆盘移动时必须遵循以下规则:1.每次只能移动一个圆盘;2.圆盘可以在X, Y 和Z中的任意塔座上;3.任何时候都不能将一只较大圆盘压在较小的圆盘之上。最后输出移动的步骤以及移动的起始位置。 1.1.3 待测试数据 该程序输入数据比较单一,为整型,可将待测试数据设置为 2、3、4、5、6。 1.2. 需求分析 1.2.1程序所能达到的基本功能 汉诺塔盘座的数量是固定的,用户可以自己确定盘的数量(1 ~~n )。在 用户确定数量之后,程序开始自动运行(移动圆盘),并依次打印出移动的步数与路线,运行结束。 1.2.2输入形式和输出值的范围 输入数据为整型数据,设定圆盘的数量,输出跟踪的步数也应为一个整型数据。 1.2.3输出的形式 将步数和移动的位置逐个输出形成一个序列。 1.2.4测试数据要求 输入数据为整型,且不要过大,否则运算量会很大并且没有多大的实际意义。 1.3. 概要设计 1.3.1 主程序流程及模块调用关系 主程序流程图见下页: 主程序流程图: i =1 i 1 图 1-1 主程序流程 模块调用关系图: 图 1-2 模块调用关系 1.3.2 核心粗线条伪码算法 Algorithm Tower( val m number of disk val A, B, C metadata ref i metadata ) n = m //输入一个整型数字以设定圆盘的数量 if (i =1 ) 1. mov(A, C) // Base Case的处理 3. else // 递归调用的方法处理General Case 1. tower(n-1, A, C, B ) 2. mov (A, C) 3. tower(n-1, B, A, C) 4. end if End Tower 1.4. 详细设计 1.4.1 每个操作的伪码算法 设计一个成员函数,命名为move_disk( ),其中设置两个形参char src和char dst分别表示两个塔盘A和C。这个函数中,只做src===(dst操作,同时使i的值增加1,即用语句i=i++。 void towers(int n, char src, char mid, char dst) { // 在该成员函数中,n, src, mid, dst 分别表示圆盘的个数与三个塔盘 If (n==1) {调用 move_disk函数} Else towers(n-1,src,dst,mid); //以 dst(C塔)为辅助,将1到n-1号圆盘全部移动到mid(B塔)上 move_disk(src, dst); //直接将A塔上的圆盘移动到C盘上 towers(n-1, mid, src, dst); //将B塔上的1至n-1号盘移动至C塔上 } 1.4.2函数调用关系 在主函数中,设定一个整型变量disk以用来向成员函数中传递参数做为圆盘的数量,然后直接调用以上函数。再用 while(n==y||n==Y) { 直接调用以上函数 } 设定一个是否需要重复运行的功能。最后程序结束,设置结束界面 。 1.5. 调试分析 1.5.1 设计与调试过程中遇到的问题及分析、体会 (1). 关于Base case的调用问题 在开始时,根据程序的概要设计,分别在Hanoi类中写了Base Case和General Case两个功能函数,move_disk( )与towers( )。然后再在主程序中分别对这两个函数进行调用,出现了第一个问题,例如当输入圆盘个数为3时,圆盘只移动了五次,如图1-3所示,画图跟踪,其结果是错误的。经过多次的分析调试,最后在towers( )函数中先调用move_disk( )操作,然后在主函数中只对towers( )进行调用,得到了正确的结果如图1-4所示。分析可知,这个错误的出现主要是对Base Case的理解上没有做好,只要深刻理解了Base Case和Gene

文档评论(0)

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

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

1亿VIP精品文档

相关文档