汉诺塔递归解法核心是三步分解:先移n−1个盘到中转柱,再移最大盘到目标柱,最后移n−1个盘到目标柱;终止条件为n==1时直接移动;参数顺序动态定义柱子角色。

Java 用递归解决汉诺塔问题,核心是把“移动 n 个盘子从 A 到 C”拆成三个可复用的子动作,并让函数反复调用自己处理更小规模的问题。关键不在写多少行代码,而在准确表达“怎么分、何时停、柱子角色怎么变”。
递归的三步分解逻辑
面对 n 个盘子(A 为起点,C 为目标,B 为中转),必须遵守规则:每次移一个、大盘不能压小盘。递归解法天然适配这个结构:
- 先把上面 n−1 个盘子,从 A 借助 C 移到 B(此时 C 是临时中转)
- 再把最底下那个最大盘子,直接从 A 移到 C(一步到位,无需辅助)
- 最后把 B 上那 n−1 个盘子,借助 A 移到 C(此时 A 成为新中转)
终止条件必须明确
递归不能无限调用,否则栈溢出。终止条件就是最简单、无法再拆的情况:
- 当 n == 1 时,不需要中转,直接从起始柱移到目标柱,比如 A → C
- 代码里必须用 if 判断并 return,否则后续递归会继续执行,导致错误或死循环
参数顺序决定柱子角色
同一个递归方法,靠传入的三个字符参数(pos1, pos2, pos3)动态定义哪根是起点、中转、目标。每次调用时它们的含义都不同:
- 第一次调用:hanoi(n, 'A', 'B', 'C') → A 起点,B 中转,C 目标
- 递归第一步:hanoi(n−1, 'A', 'C', 'B') → A 起点,C 中转,B 目标(为腾空 A 底盘)
- 递归第三步:hanoi(n−1, 'B', 'A', 'C') → B 起点,A 中转,C 目标(把中转盘收尾)
完整可运行代码示例
以下是最简清晰的 Java 实现,含注释说明每步作用:
public class Hanoi {
// 打印单次移动
public static void move(char from, char to) {
System.out.println(from + " → " + to);
}
<pre class="brush:java;toolbar:false;">// 递归主方法:把 n 个盘从 pos1 移到 pos3,用 pos2 中转
public static void hanoi(int n, char pos1, char pos2, char pos3) {
if (n == 1) {
move(pos1, pos3); // 终止:直接移动
return;
}
hanoi(n - 1, pos1, pos3, pos2); // 步骤1:n-1个盘从pos1→pos2(pos3中转)
move(pos1, pos3); // 步骤2:最大盘从pos1→pos3
hanoi(n - 1, pos2, pos1, pos3); // 步骤3:n-1个盘从pos2→pos3(pos1中转)
}
public static void main(String[] args) {
hanoi(3, 'A', 'B', 'C'); // 示例:3层汉诺塔
}}
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











