Hanoi问题 算法

问题描述:假设有3个分别命名为A、B、C的塔座,在塔座A上插有n个直径大小各不同,一小到大标号为1,2,….,n的圆盘,要求将塔座A上的n个圆盘移动到C盘上,并且仍按原来的顺序叠排。
同时遵循下列规则:
每次只能移动一个圆盘
圆盘可以插在A、B、C中的任一塔座上
任何时刻都不能将一个较大的圆盘压在较小的圆盘之上
 
 
 
算法如下:

void
Hanoi(int n,char A,char B,char C){ //将塔座A上的n个圆盘按规则搬到C上,B做辅助塔 if(n==1) move(A,1,C); //将编号为1的圆盘从A移动到C else{ Hanoi(n-1,A,C,B); //将编号为1至n-1的圆盘移动到B,C做辅助塔 move(A,n,C); //将编号为n的圆盘从A移动到C Hanoi(n-1,B,A,C); //将B上编号为1至n-1的圆盘移动到C,A做辅助塔 } }
个人理解:当有3个圆盘时,怎么移动大家应该都很清楚,那么当有多个圆盘时,把最底层的两个圆盘除外,上面的所有圆盘当作整体,然后在研究这个“整体”,如果数量还很多,可以继续使用整体思想。
而上述算法,则是一直递归到n=1为止,然后在把递归,一层层“翻”出来!
递归算法优缺点:
优点:程序结构清晰,形式简洁但递归程序在执行时需要系统提供隐式的工作栈来保存调用过程中的参数、局部变量和返回地址
缺点:占用内存空间多,运行效率较低
与此类似的还有八皇后问题,迷宫问题等。。
---------------------
作者:EasyChill
来源:CSDN
原文:https://blog.csdn.net/Song_JiangTao/article/details/79717012
版权声明:本文为博主原创文章,转载请附上博文链接!
posted @ 2019-04-12 14:32  持&恒  阅读(1439)  评论(0编辑  收藏  举报