资源描述:
《vb汉诺塔的递归算法与解析.doc》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、汉诺塔的递归算法与解析从左到右A B C柱大盘子在下,小盘子在上,借助B柱将所有盘子从A柱移动到C柱,期间只有一个原则:大盘子只能在小盘子的下面.如果有3个盘子,大中小号,越小的越在上面,从上面给盘子按顺序编号1(小),2(中),3(大),后面的原理解析引用这里的编号.小时候玩过这个游戏,基本上玩到第7个,第8个就很没有耐心玩了,并且操作的动作都几乎相同觉得无聊. 后来学习编程,认识到递归,用递归解决汉诺塔的算法也是我除了简单的排序算法后学习到的第一种算法.至于递归,简单来说就是方法内部自己调用自己,同时也一定有一个结束点.如果对方法调用栈了解的话,其实是很容
2、易理解方法的调用过程的,就是从主线程开始调用方法进行不停的压栈和出栈操作.方法的调入就是将方法压入栈中,方法的结束就是方法出栈的过程,这样保证了方法调用的顺序流.如果跟踪递归的调用情况会发现也是如此,到最后一定是这个方法最后从栈中弹出回到主线程,并且结束.栈的特点:先进后出。比如一个方法A自己调用自己,我用编号区分一下进栈过程:A->A(1)->A(2)->A(3)在A(3)时满足某种条件得以退出,回到A(2),A(2)结束回到A(1),再回到A,出栈过程:A(3)->A(2)->A(1)->A对于递归,还有一个形象的认识,就是我小时候家里有一个柜子,柜子两端
3、都是玻璃,头伸进柜子看一面镜子,会看到镜子里还有镜子,然后镜子里还有镜子,但和递归的特点不同的是这镜子的反射是没有尽头的,只要眼睛一直能看到底的话.了解完递归后,再回头来看如何用递归的方式解决汉诺塔的问题.案例1- 假设只有一个盘子的时候,盘子数量N=1只有一个步骤 将第1个盘子从A移动到C,为了对比方便我这样来描述这个步骤:步骤 盘子编号 从柱子移动 移动到柱子1 1 A C案例2- 如果有两个盘子,盘子数量N=2步骤 盘子编号从柱子移动 移动到柱子1 1
4、 A B2 2 A C3 1 B C案例3 - 如果有三个盘子,盘子数量N=3步骤 盘子编号从柱子移动 移动到柱子1 1 A C2 2 A B3 1 C B4
5、 3 A C5 1 B A6 2 B C7 1 A C 如何找出盘子移动的规律?我们要做的最重要的一件事情就是永远要把最底下的一个盘子从A移动到C看看上面从1个盘子的移动到3个盘子的移动,在移动记录中,当盘子的编
6、号和盘子数量相同的时候他们的步骤都是从A移动到C(看加粗的部分),其它的步骤对等.再观察第3个案例中的第1-3步和第5-7步第1-3步目的是从A移动到B 如果我们把B当作终点,那么这里的第1-3步理解起来和第2个案例的三个步骤完全相同,都是通过一个柱子来移动,和第2个案例比起来在后面加括号来表示1 1 A C (A->B)2 2 A B (A->C)3 1 C B (B->C)总结:将盘子B变成C即可.第5-7步目的是从B移动到
7、C 如果我们把C当作终点,那么这里的5-7步理解起来和上面也是一样的,和第2个案例的三个步骤也完全相同.和第2个案例比起来就是:5 1 B A (A->B)6 2 B C (A->C)7 1 A C (B->C)总结:将盘子B变成A即可根据这个演示可以明确几点规律:1.当盘子只有一个的时候,只有一个动作从A移动到C即结束.2.当有N个盘子的时候,中间的动作都是从A移动到C,那么表示最下面的第N个盘子移动完毕3.中间动作之上都可
8、以认为是:从A移动到B4.中间动作之下