算法 汉诺塔

  1. 汉诺塔的基本问题就大家百度吧。
  2. 算法的核心就是把最下边的盘子当作一个盘子,把上边的所有盘子,是所有盘子当作一个盘子处理。把上边所有盘子都移动到过渡的位置上,再把最下边的盘子移动到目标盘子上,最后再把上边所有的盘子放到最下边的盘子上边。
  3. 先看一下代码吧
    public class HanoiTest {
        public static void main(String[] args) {
            hanoi(3, 'A', 'B', 'C');
        }
    /**
     *  hanoi方法
     *      1、第一个参数是要移动的盘子的序号
     *      2、第二个参数是要移动过的盘子的起始位置
     *      3、第三个参数是要移动盘子的过渡位置
     *      4、第四个参数是要移动盘子的目标位置
     *
     */
    
        public static void hanoi(int n, char from, char in, char to){
            if(n == 1){
                System.out.println("第1个盘子从" + from + "移动到" + to );
            }else {
    //            比如现在n==2,下边的操作分别是将n==1的盘子从当前位置放到过渡的位置,再把当前
    //            盘子移动到目标位置,最后再把n==1盘子放到当前盘子的上边
    //            如果是三个的话,就把上边两个盘子看成是一个整体,这是非常关键的。
    //            这两步可以看成把上边所有的盘子都先移动到过渡的位置,再把最下边的盘子移动到目标位置
    //            最后把上边所有盘子移动到目标盘子上边
                hanoi(n-1, from, to, in);
                System.out.println("第" + n + "个盘子从" + from + "移动到" + to);
                hanoi(n-1, in,from,to);
            }
        }
    }
    

     

  4. 在hanoi方法中先调用一次hanoi,也就是把上边的所有盘子移动到过渡位置,然后再把最下边的盘子移动到目标位置,再调用一次hanoi,把上边所有的盘子都移动到目标位置。

  5. 那么到底怎么样理解这个递归呢

    1. 在第一次调用hanoi的时候,会进入下一层的hanoi,然后如果下一层还不是最后一个的话,就又会调用一次hanoi,当只剩下两个的时候,调用一次hannoi,然后n就是1了,然后这最上边的那个 就会直接移动到中间过渡位置。

    2. 在把最上边的盘子移动到过渡位置之后呢,就会回到n==2的方法之后中了,这时候就会把n==2的盘子移动到目标位置,然后呢就又是 递归调用hanoi方法,不过这次是将上边的盘子移动到目标位置。

    3. 当n==3的时候,把上边两个方法当作一个盘子,然后做法就和两个盘子一样啦。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值