如何理解汉诺塔小游戏(新手向)
笔者是Java新手希望各位大佬多多指教。今天我分享一个我自己对递归算法汉诺塔的理解。
public class hanoiTower{
public static void main(String[] args){
T t1 = new T();
t1.mov(5,'A','B','C');
}
}
class T{
public void mov(int num,char a,char b,char c){
if(num == 1){
System.out.println(a + "移动到" + c);
}else{
mov(num - 1,a ,c,b);
System.out.println(a + "移动到" + c);
mov(num - 1,b,a,c);
}
}
}
//
以上就是汉诺塔的所有代码了。我第一次接触汉诺塔想了好一阵,包括看着代码也不太不明白。总的来说我理解的这个汉诺塔就跟洋葱一样一层一层的拨开去理解。
第一,作为新手的第一步你需要知道System.out.println(a + "移动到" + c);
这句语句是把移动的过程输出在控制台上,让你看见他移动的过程
然后mov(num - 1, a ,c , b);
才是汉诺塔一个盘子的移动过程。
第二,也就是最重要的核心算法理解。在此之前你必须去了解汉诺塔的基本规则。我就不说了我给你们俩个其他博主链接说的非常清楚:https://www.cnblogs.com/dmego/p/5965835.html
https://www.cnblogs.com/dmego/p/5965835.html
首先我们的参数是a,b,c但是我们往mov()中传的是a,c,b与此同时输出的是a->c此时参数c里的值是b,所以输出的是a->b完成第一个盘从a到b,然后a->c再b->c.这就完成一次盘数等于2的基本移动,然后重点来了。
- 通过观察前4次玩法甚至前5次会发现你若想解决n层汉诺塔就得解决n-1层然后依次类推,类似剥洋葱一样一层一层的.如果你要解决n层就必须让n-1个盘循环从A柱移动到B柱所以必然是这样递归
- 然后当A柱只剩最后一个,直接 a->c 也就是上面的输出了.
- 再把n-1个盘从B移动到C
至此完成一次完美的汉诺塔.
我个人是这么理解的.然后至于调用方法的栈机制,算法分析我还没有学到.这个博主的讲解相对详细一点.应该有助于你们的理解.
https://www.cnblogs.com/dmego/p/5965835.html
如果有什么我说的不对的地方,或者有其他的见解欢迎讨论或者留言.感谢观看