递归实例--汉诺塔问题

汉诺塔详情请参考:https://blog.csdn.net/xb2355404/article/details/79144451
汉诺塔规则
有n个盘子,从第一个柱子,移动到第三个柱子。要求每个盘子从柱子上到柱子下,序号是从小到大。
假设三个柱子:A,B,C
我们要求将所有盘子 从A移动C
分析:
当盘子是一个的时候,直接将盘子从A移动到C

当是两个盘子的时候,我们将上方盘子标记为序号1,下面个盘子为序号2.
(1)我们将1移动到B,(上方的盘子从A移动到中间位置)
(2)2移动到C, (将最后一个盘子从A移动到C)
(3)最后将1从中间位置B移动到C。(将上方的盘子,从中间移动到第三位置)

当时三个盘子的时候,我们一次从上到下给盘子标号1,2,3.
(1)我们将1移动到C,将2移动到B,再将1从C移动到B,(到这里我们将上方两个盘子作为一个整体,并且将它整体移动到了中间位置)
(2)将3从A移动到C,
(3)将1从B移动到A,将2从B移动到C,将1从A移动到C(这一步是将上方两个盘子整体从中间位置移动到第三位置)

推论:无论多少个我们都将其视为两个盘子,将上方的n-1个盘子视为整体,最后一个盘子视为一个整体。
我们只需要完成三步骤:
1.将上方n-1个盘子从第一位置移动到中间位置
2.将最后一个盘子n从第一位置移动到最后
3.将上方的n-1个盘子从中间位置移动到第三位置

代码实现:

public class Hanoi{
    public static void main(String[] args){
        hanoi(3,'A','B','C');
    }
    /**
     * 
     * @param n   柱子数量
     * @param init 第一个柱子
     * @param    middle 中间柱子
     * @param desti  目标柱子
     */
    public static void hanoi(int n,char init,char middle,char desti){
        if(n==1){
            System.out.println("第1个盘子从"+init+"--->"+desti);
        }//
        else{
            //移动上面的所有盘子借助(第三个柱子)从第一个柱子移动到中间柱子
            hanoi(n-1,init,desti,middle);
            //移动第n个,从第一个位置移动到第三个柱子
            System.out.println("第"+n+"个盘子从"+init+"--->"+desti);
            //将上面所有盘子从中间柱子移动到第三个位置
            hanoi(n-1,middle,init,desti);
        }
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值