经典算法之汉诺塔问题

解决此问题只需记住3个步骤:

  1. 先将A柱上的n-1个盘子借助C柱移动到B柱(递归)
  2. 再将A柱上最后一个大盘移动到C柱(输出)
  3. 最后将B柱上的n-1个盘子借助A柱移动到C柱(递归)

只需记住这三个大的方向算法很快可以写出来,运算过程比较复杂不易理解。

代码如下:

/**
 * @author yang
 * @create 2020-02-20 18:04
 * @description  分治算法解决汉诺塔问题
 */
public class HanNuoTa {
    public static void main(String[] args) {
        hanNuoTa(5,'A','B','C');
    }

    /**
     *
     * @param num  盘的数量
     * @param a  a b c 代表3个柱子
     * @param b
     * @param c
     */
    public static void hanNuoTa(int num, char a, char b, char c){
        //如果只有一个盘
        if (num == 1){
            System.out.println("第1个盘从 " + a + "->" + c);
        }else { //盘子的数量大于等于2个,总是看成两个部分,最下面的一个大盘和上面的所有盘
            //先把上面的所有盘从A->B
            hanNuoTa(num - 1,a,c,b); //从a移动到b借助c  辅助c在中间
            //把最下面的从A->c
            System.out.println("第" + num + "个盘从 " + a + "->" + c);
            //把b塔的所有盘移动到c塔
            hanNuoTa(num - 1,b,a,c); //从b移动到c 辅助a在中间
        }
    }
}

这就是递归的精华所在,个人认为具体运算过程不必深究,记住前三个大的方向该算法很快可以写出来!!!

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值