核心思想:分治 + 递归
分治的思想是化繁为简,分而治之。
整个过程,是将递归融合到分治中去。我们将汉诺塔许多铁块的移动,看作只有两块,最下面一块 D(down),和上面几块 U(up)。那么,整个问题,就只需要三步(三步体现了分治思想,这里同时也是递归的开始):
- 第一步:将 U 借助 C 从 A 移到 B;(在这里,首先借助递归函数来完成,借助 C 将 U 从 A 移动到 B的过程。U 可能也是一个多层铁块,因此依旧在使用分治的化繁为简的思想,将多块的 U 看作只有两块)【HanoiTower(n-1, a, c, b);】
- 第二步:将 D 从 A 移到 C;直接移动 【n, a, c;】
- 第三步:将 U 借助 A 从 B 移到 C。(在这里,再次使用递归,借助 A 将 U 从 B 移动到 C,递归内在使用分治思想)【HanoiTower(n-1, b, a, c);】
我们一起看一下代码,很简单:
public static void HanoiTower(int n, char a, char b,char c ) {
if(n == 1) {
System.out.println("第1个铁片 从"+a+"->"+c);
} else {
HanoiTower(n-1, a, c, b); // 第一步
System.out.println("第"+n+"个铁片 从"+a+"->"+c); // 第二步
HanoiTower(n-1, b, a, c); // 第三步
}
}