7.递归-汉诺塔

汉诺塔问题:

     

       如果求解的汉诺塔是3层,可以先将上面的两层看作是一个整体。先将两层经过c作为中介移动到b,再将第三个圆盘直接移动到c。然后再将b上面的两个圆盘移动到c,通过a为中介。

算法分析(递归算法)

我们在利用计算机求汉诺塔问题时,必不可少的一步是对整个实现求解进行算法分析。到目前为止,求解汉诺塔问题最简单的算法还是同过递归来求,至于是什么是递归,递归实现的机制是什么,我们说的简单点就是自己是一个方法或者说是函数,但是在自己这个函数里有调用自己这个函数的语句,而这个调用怎么才能调用结束呢?,这里还必须有一个结束点,或者具体的说是在调用到某一次后函数能返回一个确定的值,接着倒数第二个就能返回一个确定的值,一直到第一次调用的这个函数能返回一个确定的值。
实现这个算法可以简单分为三个步骤:

(1) 把n-1个盘子由A 移到 B;
(2) 把第n个盘子由 A移到 C;
(3) 把n-1个盘子由B 移到 C;

从这里入手,在加上上面数学问题解法的分析,我们不难发现,移到的步数必定为奇数步:

(1)中间的一步是把最大的一个盘子由A移到C上去;
(2)中间一步之上可以看成把A上n-1个盘子通过借助辅助塔(C塔)移到了B上,
(3)中间一步之下可以看成把B上n-1个盘子通过借助辅助塔(A塔)移到了C上;

代码实现:

      

public class Hanoi {
    /***
     *
     * @param num: 盘子的编号
     * @param from:盘子的起始时所在的塔的编号
     * @param inter:盘子通过的中介塔的编号
     * @param to:盘子最终到达的塔的编号
     */
    public void doHanoi(int num,char from ,char inter,char to ){
        if (num==1){
            System.out.println("第 1 个盘子,从"+from+"到--"+to);
        }else{
            //将除了最下面的盘子通过to为中介进行移动到inter
            doHanoi(num-1, from,to , inter);
            //此时改编号的盘子上方已经没有盘子了,直接将其移动到目标塔
            System.out.println("第 "+num+" 个盘子,从"+from+"到"+to);
            //将移动到inter上的盘子经过from到to
            doHanoi(num-1, inter, from, to);
        }
    }

    public static void main(String[] args) {
        Hanoi hanoi = new Hanoi();
        hanoi.doHanoi(3, 'a', 'b', 'c');
    }
}

 

 

 

 

 

 

 

  

转载于:https://my.oschina.net/helloXia/blog/1861583

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值