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

如何可视化递归计算阶乘时的方法调用与返回过程

解决递归阶乘返回阶段的打印问题

你的思路方向是对的,现在的核心问题在于返回阶段的操作是在递归调用完成后才执行的——原来的代码只在进入方法时打印了调用信息,却没在拿到子递归的结果后处理返回的打印逻辑。我们只需要稍作调整,先获取子递归的返回值,计算当前层的结果,再打印返回信息即可:

public static long factorial(int n) {
    // 打印进入当前递归调用的信息
    System.out.print("factorial(" + n + ") ");
    if (n == 1) {
        System.out.println("\nreturn 1");
        return 1;
    }
    // 先触发子递归调用,拿到子问题的结果
    long subResult = factorial(n - 1);
    // 计算当前层的阶乘结果
    long currentResult = n * subResult;
    // 打印当前层的返回信息
    System.out.println("return " + n + "*" + subResult + " = " + currentResult);
    return currentResult;
}

测试输出效果

当你调用factorial(5)时,会得到和你期望完全一致的输出:

factorial(5) factorial(4) factorial(3) factorial(2) factorial(1) 
return 1
return 2*1 = 2
return 3*2 = 6
return 4*6 = 24
return 5*24 = 120

内存执行过程的对应解释

这里帮你对应内存栈的变化逻辑:

  1. 调用factorial(5),栈中压入第一个栈帧,打印factorial(5)后触发factorial(4)调用
  2. 栈中压入factorial(4)的栈帧,打印factorial(4)后触发factorial(3)调用
  3. 重复此过程直到factorial(1),触发base case,打印return 1并返回1,factorial(1)的栈帧弹出
  4. 回到factorial(2)的栈帧,拿到返回值1,计算2*1=2,打印返回信息后返回2,栈帧弹出
  5. 依次回到上层栈帧,每一层都拿到子结果、计算当前值、打印返回信息,直到factorial(5)的栈帧完成计算并返回120,栈清空

这样就能完整展示递归**调用(压栈)和返回(出栈)**两个阶段的完整执行过程了。

内容的提问来源于stack exchange,提问作者miatech

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 03:52:31