汉诺塔(递归超详解)

汉诺塔问题就是此时有三根柱子,而我们需要将其中一个柱子上的n个从大到小的盘子借助一根辅助的柱子放到另外一根柱子上,但前提是每根柱子上的盘子都必须按照从大到小的顺序排列,如图

需要特别注意的是每一次的移动都必须是大盘子在下小盘子在上, 我们假设只有两个盘子时,我们就需要先将最上面的盘子放在辅助的柱子B上,然后将最下面的盘子放在C柱上,再将B柱上的盘子放在C柱上.

下面我们以三个盘子为例,要将A柱上的盘子全部放到C柱上, 那么:

               1、把最上面两个盘子放到B柱上

               2、把最下面的盘子放到C柱上,完成这两步后如图

                 3、将B柱上的盘子移动到C柱上就完成整个过程

最后我们假设有n个盘子,那么通过前面的分析就可以得知,我们只需要将n-1个盘子放在辅助柱B上, 第n个盘子就可以放在C柱上, 这个时候A柱就空了,我们把A柱当成辅助柱, 将B柱上除最大盘子以外的其他盘子放在辅助柱A上,然后将B柱上的最大盘子放在C柱上, 依次类推就可以实现整个过程.

代码如下:

    static int step = 0;  //记录一共移动了多少步
    //每运行一次打印下结果
    public static void move(String A,String C){
        System.out.println(A +"------>" + C);
        step++;
    }
    //将A柱上的盘子移动到C柱
    public static void Hanoi(int n, String A, String B, String C) {
        if (n == 1) {
            move(A, C);
        } else {
            Hanoi(n - 1, A, C, B); //A为初始柱,C为目标柱,B为辅助柱
            move(A, C);
            Hanoi(n - 1, B, A, C); //B为初始柱,A为辅助柱,C为目标柱
        }
    }
    public static void main(String[] args) {
        Hanoi(3, "A", "B", "C");
        System.out.println(step);
    }
}

温馨提示:运行代码时盘子数不应当太多, 盘子数太多导致步骤太多,计算机会陷入类似死循环算不出结果.(   移动步数 == (2^n) - 1   ).

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值