经典算法之汉诺塔问题

解决此问题只需记住3个步骤:

  1. 先将A柱上的n-1个盘子借助C柱移动到B柱(递归)
  2. 再将A柱上最后一个大盘移动到C柱(输出)
  3. 最后将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在中间
        }
    }
}

这就是递归的精华所在,个人认为具体运算过程不必深究,记住前三个大的方向该算法很快可以写出来!!!

你可能感兴趣的:(java)