java递归之汉诺塔问题

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_20009015/article/details/83894105

源码的github地址,可以下载到本地运行

package stack.demo;

/**
 * 汉诺塔问题:
 * 假设有三根柱子,x y z
 * x上有3个圆盘,从底部开始从大到小编号为n 到 1
 * 若每次只能移动一个圆盘,且大圆盘不能在小圆盘上面
 * 现在需要将3个圆盘 都从x柱子上都移动到z柱子上,且保持原来的顺序,
 * 需要移动多少次? 若是n个圆盘呢?
 */
public class Hanoi {



    private static int num=0;//计数器

    /**
     * @param x 起始柱子
     * @param y 辅助柱子
     * @param z 目的柱子
     * @param n 盘子个数
     */
    public static void HanoiExcute(char x, char y, char z, int n) {
        //如果要把n个盘子都放到z上,那么需要把n-1到1个盘子都放到y上,然后把第n个盘子放到z上,再把n-1到1个盘子都放到z上
        if (n==1){
            move(x,z,1);//将第1个盘子 从x移动到z
        }else {
            //将n-1到1之间的所有盘子从x移动到y
            HanoiExcute(x,z,y,n-1);
            move(x,z,n);//将第n个盘子从x移动到z
            //将n-1到1之间到所有盘子从y移动到z
            HanoiExcute(y,x,z,n-1);
        }
    }


    /**
     * @param a 起始柱子
     * @param b 目的柱子
     * @param n 盘子编号
     */
    public  static void move(char a,  char b, int n){
        num++;
        System.out.println("第"+num+"次移动,将盘子"+n+"从"+a+"移动到"+b);
    }



    public static void main(String[] args) {
        char x='x';
        char y='y';
        char z='z';
        int n=30;
        HanoiExcute(x,y,z,n);
    }

}

输出结果
第1次移动,将盘子1从x移动到z
第2次移动,将盘子2从x移动到y
第3次移动,将盘子1从z移动到y
第4次移动,将盘子3从x移动到z
第5次移动,将盘子1从y移动到x
第6次移动,将盘子2从y移动到z
第7次移动,将盘子1从x移动到z

ps:汉诺塔问题的数学递归式子得到的时间复杂度为
2的n次方-1

经典的递归题目,要点在于两点。
1.HanoiExcute(char x, char y, char z, int n)这个方法的目的,就是将x上的n个圆盘按原本 的顺序从x移动到z上,y作为辅助柱子。参数含义为x是起始柱子,y是辅助柱子,z是目标柱子,n为圆盘个数。
递归的核心就是要定义好要递归的函数定义。
2.move(char a, char b, int n)这个方法的目的是,从a柱子上将编号为n的圆盘移动到b柱子上。参数含义为,a为起始柱子,b为目标柱子,n为圆盘编号

源码的github地址,可以下载到本地运行

猜你喜欢

转载自blog.csdn.net/qq_20009015/article/details/83894105