最近的算法课老师在讲到“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是你要完成的目标