汉诺塔问题源自印度一个古老的传说,印度教的“创造之神”梵天创造世界时做了 3 根金刚石柱,其中的一根柱子上按照从小到大的顺序摞着 64 个黄金圆盘。梵天命令一个叫婆罗门的门徒将所有的圆盘移动到另一个柱子上,移动过程中必须遵守以下规则:

1.每次只能移动柱子最顶端的一个圆盘;

2.每个柱子上,小圆盘永远要位于大圆盘之上;

下面我将附上我的代码和解题思路:

代码如下:

/**
 * 汉诺塔问题
 */
public class HanNuota {
    public static void main(String[] args) {
        hanoi(3,'A','B','C');
        System.out.println("总的移动了:"+ (n-1) +"次");
    }

    //定义n来记录移动次数
    public static int n = 1;
    /**
     * 定义一个递归函数来实现汉诺塔的移动问题
     * @param num    汉诺塔层数
     * @param begin  开始柱
     * @param end    目标柱
     * @param middle 中转站
     */
    public static void hanoi(int num,char begin,char end,char middle){
        if(num == 1){
            //如果层数为1,直接将其移动到目标柱
            System.out.println("第"+ n +"次:从"+ begin +"移动到"+ end);
            n++;
        }else {
            //目前情况:begin上有num层,middle无,end无
            //把begin上面的num-1层移动到middle(这里把end和middle换位置,这样就把num-1层移到了middle上)
            hanoi(num-1,begin,middle,end);
            //目前情况:begin上有1层,middle上num-1有层,end无
            //把begin的那层移动到end
            System.out.println("第"+ n +"次:从"+ begin +"移动到"+ end);
            //目前情况:begin无,middle上有num-1层,end上有1层
            n++;
            //把middle的num-1层移动到end(这里把begin和middle换位置,这样就把num-1层移动到了end上)
            hanoi(num-1,middle,end,begin);
        }
    }
}

运行结果图如下:

java递归函数实现汉诺塔问题求解 java 汉诺塔 如何递归的_System

结题思路及过程:

为了帮助大家更好的理解我的解题思路,在这里的解题过程精确到了每一步。

我在这里列举了层数为3时的运行过程,其它层数的仿照这个进行就能得到过程及结果。

//step1:    此时参数顺序为begin A,end B,middle C
    hanoi(3,begin A,end B,middle C){
        //step2(在step1的基础上):    把end和middle换位置,此时参数顺序为begin A,middle B,end C
        hanoi(2,begin A,middle B,end C){
            //在step2的基础上    把end和middle换位置,此时参数顺序为begin A,end B,middle C
            hanoi(1,begin A,end B,middle C){
                System.out.println("第"+ n +"次:从"+ begin +"移动到"+ end);//A->B
                n++;
            }
            System.out.println("第"+ n +"次:从"+ begin +"移动到"+ end);//A->C
            n++;
            //在step2的基础上    把begin和middle换位置,此时参数顺序为middle A,begin B,end C
            hanoi(1,middle A,begin B,end C){
                System.out.println("第"+ n +"次:从"+ begin +"移动到"+ end);//B->C
                n++;
            }
        }
        System.out.println("第"+ n +"次:从"+ begin +"移动到"+ end);//A->B
        n++;
        //step3(在step1的基础上):    把begin和middle换位置,此时参数顺序为middle A,end B,begin C
        hanoi(2,middle A,end B,begin C){
            //在step3的基础上    把end和middle换位置,此时参数顺序为end A,middle B,begin C
            hanoi(1,end A,middle B,begin C){
                System.out.println("第"+ n +"次:从"+ begin +"移动到"+ end);//C->A
                n++;
            }
            System.out.println("第"+ n +"次:从"+ begin +"移动到"+ end);//C->B
            n++;
            //在step3的基础上    把begin和middle换位置,此时参数顺序为begin A,end B,middle C
            hanoi(1,begin A,end B,middle C){
                System.out.println("第"+ n +"次:从"+ begin +"移动到"+ end);//A->B
                n++;
            }
        }
    }