解决此问题只需记住3个步骤:
- 先将A柱上的n-1个盘子借助C柱移动到B柱(递归)
- 再将A柱上最后一个大盘移动到C柱(输出)
- 最后将B柱上的n-1个盘子借助A柱移动到C柱(递归)
只需记住这三个大的方向算法很快可以写出来,运算过程比较复杂不易理解。
代码如下:
/**
* @author yang
* @create 2020-02-20 18:04
* @description 分治算法解决汉诺塔问题
*/
public class HanNuoTa {
public static void main(String[] args) {
hanNuoTa(5,'A','B','C');
}
/**
*
* @param num 盘的数量
* @param a a b c 代表3个柱子
* @param b
* @param c
*/
public static void hanNuoTa(int num, char a, char b, char c){
//如果只有一个盘
if (num == 1){
System.out.println("第1个盘从 " + a + "->" + c);
}else { //盘子的数量大于等于2个,总是看成两个部分,最下面的一个大盘和上面的所有盘
//先把上面的所有盘从A->B
hanNuoTa(num - 1,a,c,b); //从a移动到b借助c 辅助c在中间
//把最下面的从A->c
System.out.println("第" + num + "个盘从 " + a + "->" + c);
//把b塔的所有盘移动到c塔
hanNuoTa(num - 1,b,a,c); //从b移动到c 辅助a在中间
}
}
}
这就是递归的精华所在,个人认为具体运算过程不必深究,记住前三个大的方向该算法很快可以写出来!!!