"Hanno Tower"-汉诺塔递归解决Review

最近的算法课老师在讲到“D & R”时,提到“递归(Recursive)”,再次听到这个词,脑海中复现的第一画面就是“三座塔”即经典的汉诺塔问题,本文就该问题的递归思想进行总结。

汉诺塔问题: 有三座塔台“A, B, C”,在塔A上有若干个盘子,盘子由上至下依次从小到大叠在一起,现在需要采用最少的移动步骤,将所有盘子从塔A移动到塔C,重点是必须保持盘子的大小顺序(从上到下依次从小到大)

这里写图片描述

递归思想描述(极简思维)
  • 将所有的盘子看作两部分,底下最大的(以下称最大)和其余剩下的> (以下称其余)。
  • 首先将其余从A转移到B, 再将最大从A转移到C,最后将其余(此时在B上)转移到C。(你若问其余的怎么办,这意味着你没有明白)

代码实现:

/**
 * Hanno Tower
 */
class HannoTower {

    public int counter = 0;

    public void HannoOperation(Integer p, Character start, Character middle, Character target) {

        if (p == 1) {
            System.out.println(++this.counter+" >::| "+start+" ------> "+target);
        } else {
            HannoOperation(p-1,start, target, middle);
            HannoOperation(1, start, middle, target);
            HannoOperation(p-1, middle, start, target);
        }
    }

}

/**
* Test Hanno Tower
*/
HannoTower ht = new HannoTower();
ht.HannoOperation(6, 'A', 'B', 'C');
  • p是盘子数, start是起始盘子放置的塔,middle是中间的塔,target是你要完成的目标

测试用例:P为3,结果如下:

这里写图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值