汉诺塔程序实验报告.docx
- 文档编号:2389689
- 上传时间:2022-10-29
- 格式:DOCX
- 页数:6
- 大小:19.91KB
汉诺塔程序实验报告.docx
《汉诺塔程序实验报告.docx》由会员分享,可在线阅读,更多相关《汉诺塔程序实验报告.docx(6页珍藏版)》请在冰豆网上搜索。
汉诺塔程序实验报告
竭诚为您提供优质文档/双击可除
汉诺塔程序实验报告
篇一:
汉诺塔程序实验报告
实验题目:
hanoi塔问题
一、问题描述:
假设有三个分别命名为A,b和c的塔座,在塔座b上插有n个直径大小各不相同、从小到大编号为1,2,…,n的圆盘。
现要求将塔座b上的n个圆盘移至塔座A上并仍按同样顺序叠排,圆盘移动时必须遵守以下规则:
(1)每次只能移动一个圆盘;
(2)圆盘可以插在A,b和c中任一塔上;
(3)任何时刻都不能将一个较大的圆盘压在较小的圆盘之上。
要求:
用程序模拟上述问题解决办法,并输出移动的总次数,圆盘的个数从键盘输入;并想办法计算出程序运行的时间。
二、算法思路:
1、建立数学模型:
这个问题可用递归法解决,并用数学归纳法又个别得出普遍解法:
假设塔座b上有3个圆盘移动到塔座A上:
(1)"将塔座b上2个圆盘借助塔座A移动到塔座c上;
(2)"将塔座b上1个圆盘移动到塔座A上;
(3)"将塔座c上2个圆盘借助塔座b移动到塔座A上。
其中第2步可以直接实现。
第1步又可用递归方法分解为:
1.1"将塔座b上1个圆盘从塔座x移动到塔座A;
1.2"将塔座b上1个圆盘从塔座x移动到塔座c;
1.3"将塔座A上1个圆盘从塔座Z移动到塔座c。
第3步可以分解为:
3.1将塔座c上1个圆盘从塔座Y移动到塔座b;
3.2将塔座c上1个圆盘从塔座Y移动到塔座A;
3.3将塔座b上1个圆盘从塔座x移动到塔座A。
综上所述:
可得到移动3个圆盘的步骤为
b->A,b->c,A->c,b->A,c->b,c->A,b->A,
2、算法设计:
将n个圆盘由b依次移到A,c作为辅助塔座。
当n=1时,可以直接完成。
否则,将塔座b顶上的n-1个圆盘借助塔座A移动到塔座c上;然后将圆盘b上第n个圆盘移到塔座A上;最后将塔座c上的n-1个圆盘移到塔座A上,并用塔座b作为辅助塔座。
三、原程序
#include
#include
#include
inttimes=0;
voidmove(chara,charb)
{
printf("%c---->%c\n",a,b);
}
voidhno(intn,chara,charb,charc)
{
if(n==1)
{
move(a,c);
times++;
}
else
{
hno(n-1,a,c,b);
move(a,c);
times++;
hno(n-1,b,a,c);
}
}
voidmain()
{
unsignedstart,finish;
intn;
printf("请输入汉诺塔的层数:
");
scanf("%d",
start=getTickcount();//
hno(n,b,c,A);
finish=getTickcount();
floattime=(finish-start)/1000.0;
printf("共移动了%d次!
\n",times);
cout }
四:
五.结论分析
通过对上述递归在hanoi塔问题上的应用分析,可以得出如下结论:
递归应用中的hanoi塔问题分析递归应用中的
1、hanoi塔问题中函数调用时系统所做工作一个函数在运行期调用另一个函数时,在运行被调用函数之前,系统先完成3件事:
1将所有的实参、返回地址等信息传递给被调用函数保存。
○
2为被调用函数的局部变量分配存储区;○
3将控制转移到被调用函数的入口。
○
从被调用函数返回调用函数前,系统也应完成3件事:
①保存被调用函数的结果;
②释放被调用函数的数据区;
③依照被调用函数保存的返回地址将控制转移到调用函数。
当有多个函数构成
嵌套调用时,按照“后调用先返回”的原则,上述函数之间的信息传递和控制转
移必须通过“栈”来实现,即系统将整个程序运行时所需的数据空间安排在一个
栈中,每当调用一个函数时,就为其在栈顶分配一个存储区,每当从一个函数
退出时,就释放其存储区,因此当前运行函数的数据区必在栈顶。
2、递归调用过程中,在程序执行之前无法知道控制这种调用栈的规模,因为这一规模取决于递归调用的次序。
在这种情况下,程序的地址空间可能动态变化;
3、递归应用于程序设计时,结构清晰、程序易读,编制和调试程序很方便,不需要用户自行管理递归工作栈。
但递归应用于计算机时需要占用大量系统资源(包括堆栈、软中断和存贮空间等),并消耗大量处理时间。
因此,可以考虑采用并行计算进行处理,但
4、递归是串行的,其第n步运算依赖于第n-1步运算,所以在计算机软件理论上不存在递归问题并行计算的可能性。
实际上是否存在并行递归计算有待进一步探讨。
篇二:
汉诺塔演示程序实验报告
课程设计报告
课程名称:
高级语言课程设计课程代码:
07300561设计内容:
汉诺塔演示系统专业:
计算机科学与技术
20XX年12月16日
目录
1.课程设计目的............................................................31.1内容简介.............................................错误!
未定义书签。
1.2功能实现.............................................错误!
未定义书签。
2.课程设计题目描述和要求..................................................32.1描述.................................................错误!
未定义书签。
2.2要求.................................................错误!
未定义书签。
3.课程设计报告内容........................................................33.1内容概要.............................................错误!
未定义书签。
3.2功能实现.............................................错误!
未定义书签。
3.3程序流程图...........................................错误!
未定义书签。
3.4程序截图..............................................................6
3.5详细内部设计介绍4.总结
5小组分工情况
1.课程设计目的
随着社会的进步我们用来娱乐的游戏世界也越来越丰富,越来越复杂。
本程序的汉诺塔游戏不但包括了游戏最基本的功能,而且还能培养用户的逻辑思维能力,本游戏实现的是一个自动演示搬移汉诺塔的功能,此功能能够帮助初次接触此游戏的用户了解此游戏的玩法。
2.课程设计题目描述和要求
2.1描述
本程序是一个能够实现汉诺塔搬移演示功能的mFc程序2.2要求
实现用图形界面,画出三个杆和最多七个矩形盘子,形成三个塔,分别为A、b、c塔,同时盘子数目可以人工进行设定,让程序自动的完成把A塔上的盘子搬移到c塔上的过程,实现自动演示。
3.课程设计报告内容3.1内容概要
有三个表示塔的对象,分别命名为A、b、c塔,A上有若干个(不超过七个)盘子,盘子大小不等,并按照大小顺序依次摆放在A塔上,大盘在下小盘在上,程序实现自动演示,把A塔上的盘子依次全部搬移到c塔上,要求每次只能移动一个盘子并且在任何时候不允许大盘子在小盘子之上,并且在演示过程中可以实现暂停功能。
3.2功能实现
设计图形用户界面的mFc程序,用户可以通过单击汉诺塔界面中提供的按钮,进行盘子数量的设置并且单击开始按钮让程序自动演示A塔上盘子移动到c塔上的过程,并且在程序运行过程中可随时单机程序界面中提供的按钮实现游戏暂停,重新开始游戏等功能。
3.3程序流程图
3.4程序截图
1、开始游戏:
为了更好地人机交互,在执行游戏时会弹出一个欢迎的对话框。
功能图:
相关代码:
intcmyDlg:
:
oncreate(LpcReATesTRucTlpcreatestruct){
if(cDialog:
:
oncreate(lpcreatestruct)==-1)return-1;
//ToDo:
Addyourspecializedcreationcodeheremessagebox("欢迎进入游戏!
");return0;}
2.游戏主界面
2.开始演示
相关代码:
voidcmyDlg:
:
onbutton1(){
篇三:
汉诺塔问题实验报告
1.实验目的:
通过本实验,掌握复杂性问题的分析方法,了解汉诺塔
游戏的时间复杂性和空间复杂性。
2.问题描述:
汉诺塔问题来自一个古老的传说:
在世界刚被创建的时候有一座钻石宝塔(塔A),其上有64个金碟。
所有碟子按从大到小的次序从塔底堆放至塔顶。
紧挨着这座塔有另外两个钻石宝塔(塔b和塔c)。
从世界创始之日起,婆罗门的牧师们就一直在试图把塔A上的碟子移动到塔c上去,其间借助于塔b的帮助。
每次只能移动一个碟子,任何时候都不能把一个碟子放在比它小的碟子上面。
当牧师们完成任务时,世界末日也就到了。
3.算法设计思想:
对于汉诺塔问题的求解,可以通过以下三个步骤实现:
(1)将塔A上的n-1个碟子借助塔c先移到塔b上。
(2)把塔A上剩下的一个碟子移到塔c上。
(3)将n-1个碟子从塔b借助于塔A移到塔c上。
4.实验步骤:
1.用c++或c语言设计实现汉诺塔游戏;
2.让盘子数从2开始到7进行实验,记录程序运行时间和递归调用次数;
3.画出盘子数n和运行时间t、递归调用次数m的关系图,并进行分析。
5.代码设计:
hanio.cpp
#include"stdafx.h"
#include
#include
#include
voidhanoi(intn,charx,chary,charz)
{
if(n==1)
{
printf("从%c->搬到%c\n",x,z);
}
else
{
hanoi(n-1,x,z,y);
printf("从%c->%c搬到\n",x,z);
hanoi(n-1,y,x,z);
}
}
voidmain()
{
intm;
printf("inputthenumberofdiskes:
");
scanf("%d",
printf("Thesteptomoving%3ddiskes:
",m);
hanoi(m,a,b,c);
}
自定义头文件
:
#pragmaonce
#include"targetver.h"
#include
#include
结果(:
汉诺塔程序实验报告)如下:
6.递归应用中的hanoi塔问题分析
1)hanoi塔问题中函数调用时系统所做工作
一个函数在运行期调用另一个函数时,在运行被调用函数之前,
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 汉诺塔 程序 实验 报告