汉诺塔问题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验二知识表示方法
梵塔问题实验
1.实验目的
(1)了解知识表示相关技术;
(2)掌握问题规约法或者状态空间法的分析方法。
2.实验内容(2个实验内容可以选择1个实现)
(1)梵塔问题实验。熟悉和掌握问题规约法的原理、实质和规约过程;理解规约图的表示方法;
(2)状态空间法实验。从前有一条河,河的左岸有m个传教士、m个野人和一艘最多可乘n人的小船。约定左岸,右岸和船上或者没有传教士,或者野人数量少于传教士,否则野人会把传教士吃掉。搜索一条可使所有的野人和传教士安全渡到右岸的方案。
3.实验报告要求
(1)简述实验原理及方法,并请给出程序设计流程图。
我们可以这样分析:
(1)第一个和尚命令第二个和尚将63个盘子从A座移动到B座;
(2)自己将底下最大的盘子从A移动到C;
(3)再命令第二个和尚将63个盘子从B座移动到C;(4)第二个和尚命令第三个和尚重复(1)(2)(3);以此类推便可以实现。这明显是个递归的算法科技解决的问
题。
(2)源程序清单:
#include
#include
using namespace std;
void main()
{
void hanoi(int n,char x,char y,char z);
int n;
printf("input the number of diskes\n");
scanf("%d",&n);
hanoi(n,'A','B','C');
}
void hanoi(int n,char p1,char p2,char p3) {
if(1==n)
cout<<"盘子从"< else { hanoi(n-1,p1,p3,p2); cout<<"盘子从"< hanoi(n-1,p2,p1,p3); } } (3)实验结果及分析。 实验很好的完成了实验目的,成功的输出了解决汉诺塔问题的方案。递归实现的汉诺塔,使用递归调用方法编写程序简洁清晰,可读性强。因此,人们都喜欢用递归调用的方法来解决某些问题。但是,用这种方法编写的程序执行起来在时间和空间的开销上都比较大,即要占用较多的内存单元,又要花费很多的计算时间。因为递归调用时要占用内存的许多单元存放"递推"的中间结果,较复杂的递归占用内存空间较多。因此,在一些内存小速度慢的小机器上最好不要采用递归调用的办法,不然,效率很低。一般的凡是可用递归调用方法编写的程序都可以用迭代的方法来编写。一般说来,相同的间题用迭代方法编写要比用递归调用方法编写的源程序长些。