




已阅读5页,还剩9页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
汉诺塔问题的算法,(汉诺)塔问题 这是一个古典的数学问题,是一个用递归方法解题的典型例子。问题是这样的: 古代有一个梵塔,塔内有3个座A、B、C,开始时座上有个盘子,盘子大小不等,大的在下,小的在上(见图7.11)。有一个老和尚想把这个盘子从座移到座,但每次只允许移动一个盘,且在移动过程中在3个座上都始终保持大盘在下,小盘在上。在移动过程中可以利用座,要求编程序打印出移动的步骤。,此时老和尚只需这样做: (1) 命令第2个和尚将63个盘子从A座移到B座; (2) 自己将1个盘子(最底下的、最大的盘子)从A座移到C座; (3) 再命令第2个和尚将63个盘子从B座移到C座。,老和尚想:假如有另外一个和尚能有办法将63个 盘子从一个座移到另一座。那么,问题就解决了。,第2个和尚怎样才能将63个盘子从A座移到B座?,他是这样做的: (1) 命令第3个和尚将62个盘子从A座移到C座; (2) 自己将1个盘子(最底下的、最大的盘子)从A座移到B座; (3) 再命令第3个和尚将62个盘子从C座移到B座。,第2个和尚想:假如有另外一个和尚能有办法将62个盘子从一个座移到另一座。我就能将63个盘子从A座移到B座。,如此“层层下放”, 直到找到第64个和尚,让他完成将1个盘子从一个座移到另一座,至此问题解决,只有第64个和尚的任务完成后,第63个和尚的任务 才能完成。只有第2到第64个和尚任务完成后,第1 个和尚的任务才能完成。这是一个典型的递归问题,为便于理解:先分析3个盘子从座移到座的过程: (1) 将座上2个盘子先移到座上(借助); (2) 将座上剩下的1个盘子移到座上; (3) 将座上2个盘子移到座上(借助)。,1.1 将上1个盘子从移到; 1.2 将上1个盘子从移到; 1.3 将上1个盘子从移到。,1.1,1.2,1.3,第1步 2个盘子从A移到B 可分解为:,3.1 将上1个盘子从移到上; 3.2 将上1个盘子从移到上; 3.3 将上1个盘子从移到上。,3.1,3.2,3.3,第3步 2个盘子从B移到C 可分解为:,综合起来,可得到移动3个盘子的步骤:,, , ,。 共经历7步。 移动n个盘子要经历2n-1步。,由上面的分析可知:将个盘子从座移到座可以分解为以下3个步骤: (1) 将座上n-1个盘子先移到座上(借助); (2) 将座上剩下的1个盘子移到座上; (3) 将座上n-1个盘子移到座上(借助)。,第步,对应关系是 : one,two,three。 第步,对应关系是: one,two,three。,上面3个步骤可分成两类操作:,程序如下: #include void main() void hanoi(int n,char one,char two,char three); /* 对hanoi函数的声明 */ int m; printf(“input the number of diskes:“); scanf(“%d”, ,void hanoi(int n,char one,char two,char three) /* 定义hanoi函数,将个盘从one座借助two座,移到three座 */ void move(char x,char y); /* 对move函数的声明 */ if(n=1) move(one,three); else hanoi(n-1, one , three , two); move(one,three); hanoi(n-1, two , one , three); void move(char x,char y) /* 定义move函数 */ printf(“%c
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
评论
0/150
提交评论