递归高级应用(汉诺塔)

拜拜、爱过 提交于 2020-01-28 02:19:06

一:汉诺塔问题

所有的盘子刚开始都是放在塔座A上,要求将所有的盘子从塔座A移动到塔座C上,每次只能移动一个盘子,任何盘子不能放在比自己小的盘子上.
图1

二:移动子树

把上层的全部看成一个整体–子树 , 每次移动后子树都在减小,最后子树剩下一个,再放到C座即可
图2

三:递归的解决

public class HanNuoTa {
    public static void main(String[] args) {
        moveTower(3,'A','B','C');
    }

    /*
    *移动盘子
    * 参数;
    *  1.num: 移动的盘子数量
    *  2.a: 塔座A
    *  3.b: 塔座B
    *  4.c: 塔座C
    */
    public static void moveTower(int num,char a ,char b,char c){
        if (num == 1){
            //只有一个盘子的时候
            System.out.println("盘子1 从"+ a + "移动到"+c);
        }else{
            //大于一个盘子的时候
            //1.意思是把上面 num-1 个盘子 从 a 移动 到 b(此时 c 作为过度塔)
            moveTower(num-1,a,c,b);

            //2.移动最底下那个盘子到c
            System.out.println("盘子"+num+"从"+a+"移动到"+c);

            //现在num-1个盘子在b塔
            //3.把 b 座的个盘子移动到 c (此时 a 作为过度塔)
            moveTower(num-1,b,a,c);

        }
    }
}

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!