汉诺塔:汉诺塔(又称河内塔)问题是源于印度一个古老传说的益智玩具。大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘。[1]大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上。并且规定,在小圆盘上不能放大圆盘,在三根柱子之间一次只能移动一个圆盘。
游戏规则:
将A上的n个盘子移动到C上,在移动的过程中,大盘子不能盖在小盘子上面。
问题分析:
此游戏我们可以通过递归来完成,抓住递归的本身语义,我们知道递归最终结束步骤是将最后一个盘子从A移到C上, 子问题为将除过最下面的盘子移动到B上,将最下面的盘子一步移动到C上,再将剩下的n-1个盘子移动到C上。
代码实现:
public static void main(String[] args) {
int n = 3;
hanoiTower(n,'A','B','C');
}
// 此时需要将A上的n个盘子移动到C上,B作为辅助
public static void hanoiTower(int n,char A,char B,char C) {
// 1.base case。不借助任何其他的移动,一步就可到位的条件是啥?n取什么值时?
// 当n == 1时,说明此时A上就一个盘子,一步到位,直接将A上的这一个盘子移动到C上即可
if (n == 1) {
move(1,A,C);
return;
}
// 此时n >= 2
// 先将A上的这n - 1个盘子移动到B上,C作为辅助
hanoiTower(n - 1,A,C,B);
// 此时A上就只剩下最大的那个n盘子,一步到位,将最大的盘子移动到C上即可
move(n,A,C);
// 将B上的这n - 1个盘子从B移动到C,A作为辅助
hanoiTower(n - 1,B,A,C);
}
// 将编号为n的盘子从source-> dist塔上
private static void move(int nDisks, char sourceTower, char distTower) {
System.out.println("编号为" + nDisks + "的盘子从" + sourceTower + "->" + distTower);
}