汉诺塔游戏的思路分析:
- 如果只有一个盘n=1
- A->C
- 如果我们有 n >= 2 情况,我们总是可以看做是两个盘:1、最下边的盘;2、上面的盘
- 先把 最上面的盘 A->B
- 把最下边的盘 A->C
- 把B塔的所有盘 从 B->C
public class Hanoitower {public static void main(String[] args) {hanoiTower(10, 'A', 'B', 'C');}//汉诺塔的移动的方法//使用分治算法public static void hanoiTower(int num, char a, char b, char c) {//如果只有一个盘if(num == 1) {System.out.println("第1个盘从 " + a + "->" + c);} else {//如果我们有 n >= 2 情况,我们总是可以看做是两个盘 1.最下边的一个盘 2. 上面的所有盘//1. 先把 最上面的所有盘 A->B, 移动过程会使用到 chanoiTower(num - 1, a, c, b);//2. 把最下边的盘 A->CSystem.out.println("第" + num + "个盘从 " + a + "->" + c);//3. 把B塔的所有盘 从 B->C , 移动过程使用到 a塔hanoiTower(num - 1, b, a, c);}}}
我来分析一波,很多人原理都懂了,但为什么面对程序还是一头雾水呢? 我觉得可能是因为没理解程序里面的参数是怎么回事,else里面的参数估计就有人看不明白了,在你第一次在主函数中把A,B,C 这三个字符输进去的时候,调用函数是没问题的,形参和实参一一对应,hanoi函数里面的A,B,C就对应着’A’, ‘B’,’C’三个柱子,但是你一旦开始递归,第一次递归函数里面的三个参数A,B,C代表的就是柱子’A’,柱子’C’,柱子’B’ 了,每一次递归A,B,C三个参数代表的柱子都在不断的跳动,所以函数printf里面的从A到C进行输出,其实真正打印出来的各种移动情况都有,而else里面的第一句话执行完毕后,就是实现了把第一个柱上除了最后一个盘子上面的所有盘子移到了B,第二句其实是最初的参数和柱子对应的A和C,即把最后一个从A移到C,第三句又是把所有的从B移到C。
其实最了不得地方在于,函数本身参数是定死的,但是那三个参数却可以代表不同的真实的具体哪个柱子上的盘子进行移动,而参数的位置代表的是移动的思想。
最后道行不是很高的话,不要深究每一步,容易把人逼疯,到5个盘子想想就差不多了。
还有按照上面说的,可以把n等于2带入试试看。
