请讲解计算机如何解读我的汉诺塔(Towers of Hanoi)递归代码
首先先把你贴的代码整理成可阅读的格式:
public class TowerOfHanoi { public static void main(String[] args) { Scanner input = new Scanner(System.in); System.out.print("How many disks are there?"); int disks = input.nextInt(); Towers(disks, 'A', 'B', 'C'); } public static void Towers(int n, char from, char inter, char to) { if(n == 1) { System.out.println("Disk 1 from " + from + " to " + to); } else { Towers(n - 1, from, to, inter); System.out.println("..."); } } }
先给你提个醒:这段代码其实是不完整的,标准汉诺塔的递归逻辑缺了关键步骤,不过咱先顺着它的逻辑,一步步讲计算机是怎么执行的,之后再补全正确的逻辑。
计算机的执行流程(以输入3个盘子为例)
咱就拿你输入3的情况,跟着计算机的“思路”走一遍:
启动主函数
计算机先跑main方法:先弹出输入提示,你输入3后,这个数字存在disks变量里。接着调用Towers(3, 'A', 'B', 'C')——这个调用的意思是:把3个盘子从A柱(from)通过B柱(inter,中间过渡)移到C柱(to,目标)。第一次进入
Towers(3, 'A', 'B', 'C')
因为n=3≠1,所以走else分支:- 首先调用
Towers(2, 'A', 'C', 'B')——注意参数变了!现在任务变成:把2个盘子从A柱,通过C柱过渡,移到B柱。 - 等这个调用执行完,才会执行后面的
System.out.println("...")。
- 首先调用
进入
Towers(2, 'A', 'C', 'B')n=2≠1,继续走else分支:- 先调用
Towers(1, 'A', 'B', 'C')——任务又变了:把1个盘子从A柱,通过B柱过渡,移到C柱。 - 同样,等这个调用结束才会打印省略号。
- 先调用
进入
Towers(1, 'A', 'B', 'C')
终于触发if(n==1)的条件了!计算机直接执行打印语句:Disk 1 from A to C。这个方法执行完毕,回到上一层(也就是Towers(2, 'A', 'C', 'B')的调用位置)。回到
Towers(2, 'A', 'C', 'B')
刚才的Towers(1,...)跑完了,现在执行System.out.println("..."),打印一个省略号。然后这个方法就结束了,回到最上层的Towers(3, 'A', 'B', 'C')。回到
Towers(3, 'A', 'B', 'C')
执行完Towers(2,...)后,打印另一个省略号,整个方法结束。
所以你这段代码输入3的话,最终输出是:
Disk 1 from A to C ... ...
补全后的完整汉诺塔逻辑
为啥说你的代码不完整?因为标准汉诺塔的递归需要三步:
- 把上面n-1个盘子从
from柱移到inter柱(用to柱当过渡) - 把第n个盘子直接从
from柱移到to柱 - 把n-1个盘子从
inter柱移到to柱(用from柱当过渡)
补全后的Towers方法应该是这样:
public static void Towers(int n, char from, char inter, char to) { if(n == 1) { System.out.println("Disk 1 from " + from + " to " + to); } else { Towers(n - 1, from, to, inter); // 步骤1:移n-1个到中间柱 System.out.println("Disk " + n + " from " + from + " to " + to); // 步骤2:移第n个到目标柱 Towers(n - 1, inter, from, to); // 步骤3:移n-1个到目标柱 } }
补全后再跑输入3的情况,计算机的执行流程就完整了:
- 先处理
Towers(3,A,B,C):- 先跑
Towers(2,A,C,B):- 跑
Towers(1,A,B,C)→ 打印Disk1 A→C - 打印
Disk2 A→B - 跑
Towers(1,C,A,B)→ 打印Disk1 C→B
- 跑
- 打印
Disk3 A→C - 跑
Towers(2,B,A,C):- 跑
Towers(1,B,C,A)→ 打印Disk1 B→A - 打印
Disk2 B→C - 跑
Towers(1,A,B,C)→ 打印Disk1 A→C
- 跑
- 先跑
最终输出就是完整的汉诺塔移动步骤,这才是递归解决汉诺塔的核心逻辑——把大任务拆成小任务,直到小任务简单到直接能执行,再一步步回溯完成所有步骤。
内容的提问来源于stack exchange,提问作者lefty

