You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

请讲解计算机如何解读我的汉诺塔(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的情况,跟着计算机的“思路”走一遍:

  1. 启动主函数
    计算机先跑main方法:先弹出输入提示,你输入3后,这个数字存在disks变量里。接着调用Towers(3, 'A', 'B', 'C')——这个调用的意思是:把3个盘子从A柱(from)通过B柱(inter,中间过渡)移到C柱(to,目标)。

  2. 第一次进入Towers(3, 'A', 'B', 'C')
    因为n=3≠1,所以走else分支:

    • 首先调用Towers(2, 'A', 'C', 'B')——注意参数变了!现在任务变成:把2个盘子从A柱,通过C柱过渡,移到B柱。
    • 等这个调用执行完,才会执行后面的System.out.println("...")。
  3. 进入Towers(2, 'A', 'C', 'B')
    n=2≠1,继续走else分支:

    • 先调用Towers(1, 'A', 'B', 'C')——任务又变了:把1个盘子从A柱,通过B柱过渡,移到C柱。
    • 同样,等这个调用结束才会打印省略号。
  4. 进入Towers(1, 'A', 'B', 'C')
    终于触发if(n==1)的条件了!计算机直接执行打印语句:Disk 1 from A to C。这个方法执行完毕,回到上一层(也就是Towers(2, 'A', 'C', 'B')的调用位置)。

  5. 回到Towers(2, 'A', 'C', 'B')
    刚才的Towers(1,...)跑完了,现在执行System.out.println("..."),打印一个省略号。然后这个方法就结束了,回到最上层的Towers(3, 'A', 'B', 'C')。

  6. 回到Towers(3, 'A', 'B', 'C')
    执行完Towers(2,...)后,打印另一个省略号,整个方法结束。

所以你这段代码输入3的话,最终输出是:

Disk 1 from A to C
...
...

补全后的完整汉诺塔逻辑

为啥说你的代码不完整?因为标准汉诺塔的递归需要三步:

  1. 把上面n-1个盘子从from柱移到inter柱(用to柱当过渡)
  2. 把第n个盘子直接从from柱移到to柱
  3. 把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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 10:53:34