求解汉诺塔问题

       汉诺塔是经典问题。具体表述为:由很多放置在三个塔座上的盘子组成的一个古老难题,所有盘子直径都是不同的,盘子中央都有一个洞使他们刚好可以放在塔座上。所有的盘子刚开始放在塔座A上面,这个难题的目标是将所有的盘子都从塔座A上移动到塔座C上,每一次只能移动一个盘子,并且任何一个盘子都不可以放在比自己小的盘子之上。如下图所示:

这里写图片描述

       以三个盘子为例,如果以手工进行试验需要移动7次,先后顺序是:

Disk 1 from A to C
Disk 2 from A to B
Disk 1 from C to B
Disk 3 from A to C
Disk 1 from B to A
Disk 2 from B to C
Disk 1 from A to C

      可以想象当A上盘子数目较大时就会出现非常复杂的操作,这时候人工几乎是不能完成的。仔细观察发现在移动四个盘子到C过程中必然有一个过程是B上有3个盘子,这时候只需要将最大的盘子从A移动到C即可。接下来就是将3个盘子从B移动到C的问题。这样分析可以使用递归来解决该问题。

这里写图片描述

      也就是说当需要将A上面N个盘子按照规则转移到C塔座上时,可以转化为将(N-1)个盘子从B转移到A上即可,也就是说由N个盘子转移到C塔座上变成(N-1)个盘子从A转移到C上的问题,递归可以实现这个过程。

//汉诺塔经典问题
//使用递归能解决该问题是因为将A上的盘子移动到C上需要经过将A上的n-1个盘子先按次序放在B上,之后B上的n-1个盘子才能放在C上面
//解决这个问题其实是分为两个步骤
//step1 A(N)--->B(N-1) A(1)--->C(1)
//step2 B(N-2)--->A(N-3) B(2)--->C(2)
class HanoiTower
{

    public static void doHanoiTower(int size,char source,char inner,char destSource)
    {
        //递归终止条件
        //最小的盘子是最后一次递归 
        //停止递归
        if(size==1)
        {   
            System.out.println("disk1 from "+source+" to "+destSource);
            return;
        }
        else
        {   
            //step1 A(N)--->B(N-1) 
            doHanoiTower(size-1, source, destSource,inner);
            // 移动过程
            System.out.println("disk"+size+" from "+source+" to "+destSource);
            // B(N-2)--->A(N-3)
            doHanoiTower(size-1, inner, source, destSource);
        }
    }
}

       假设A上有四个盘子,则根据递归测试移动过程是:

public static void main(String[] args) {
        int size=4;//初始化A上存放三个盘子 大小依次排列
        HanoiTower.doHanoiTower(size, 'A', 'B', 'C');
}
disk1 from A to B
disk2 from A to C
disk1 from B to C
disk3 from A to B
disk1 from C to A
disk2 from C to B
disk1 from A to B
disk4 from A to C
disk1 from B to C
disk2 from B to A
disk1 from C to A
disk3 from B to C
disk1 from A to B
disk2 from A to C
disk1 from B to C

      用递归就可以通过少量代码解决看起来特别复杂的问题。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值