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