经典递归问题之汉诺塔

目录

一、简介

二、分析

三、代码


一、简介

         汉诺塔(Tower of Hanoi),又称河内塔,是一个源于印度古老传说的益智玩具。大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘。大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上。并且规定,在小圆盘上不能放大圆盘,在三根柱子之间一次只能移动一个圆盘。

         我们要实现的,就是把A柱子上的n个盘子移动到C柱子上

         要求:一次只能挪动一个盘子;

                     小盘子必须在大盘子上(任何时候);

二、分析

            第一种情况:当n=1时:

 

            第二种情况:当n=2时:

 

           第三种情况,当n=3时:

 

       结合上述三种情况可以看出,当A柱子有n个盘子需要挪动时,每次要先考虑的都是把前n-1个盘子从A柱子挪到B柱子,然后再把第n个盘子挪到C柱子上,此时A柱子没有盘,就作为中间柱子,可以理解为AB柱子位置对调,那么问题又转化成了当前新A柱子的前n-1个盘子挪动到新B柱子,然后又把新A柱子的第n个盘挪到C柱子上的问题,以此类推。

       思路为:

        (1):当n=1时,将1号盘子从A柱子移动到C柱子

        (2):当n>1时,第一步将前n-1个盘子从A移动到B,C为中间柱子。

                 第二步,将n号盘子从A移到C

               第三步,将A作为中间柱子,最终要将n-1个盘子挪到c,此时问题直接回归第一步,构成了递归调用。

 

三、代码

完整代码:

public class Hanoi {
    public static void main(String[] args) {
        hanoi(3,"A","B","C");
    }

    public static void hanoi(int n,String a,String b,String c){
        if (n == 1){
            move(n,a,c);
            return;
        }
        //将c看作中间柱子,将n-1个盘子从a移动到b
        hanoi(n-1,a,c,b);
        move(n,a,c);   //将第n个盘子从a移到c
        //将a看作中间柱子,将n-1个碟子从b移动到c
        hanoi(n-1,b,a,c);
    }

    public static void move(int no, String from,String to){
        System.out.println("将"+no + "号盘子从" + from+"柱子" + "移动到"+to+"柱子");
    }
}

执行结果: 

Over!!!

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值