如何可视化递归计算阶乘时的方法调用与返回过程
解决递归阶乘返回阶段的打印问题
你的思路方向是对的,现在的核心问题在于返回阶段的操作是在递归调用完成后才执行的——原来的代码只在进入方法时打印了调用信息,却没在拿到子递归的结果后处理返回的打印逻辑。我们只需要稍作调整,先获取子递归的返回值,计算当前层的结果,再打印返回信息即可:
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
内存执行过程的对应解释
这里帮你对应内存栈的变化逻辑:
- 调用
factorial(5),栈中压入第一个栈帧,打印factorial(5)后触发factorial(4)调用 - 栈中压入
factorial(4)的栈帧,打印factorial(4)后触发factorial(3)调用 - 重复此过程直到
factorial(1),触发base case,打印return 1并返回1,factorial(1)的栈帧弹出 - 回到
factorial(2)的栈帧,拿到返回值1,计算2*1=2,打印返回信息后返回2,栈帧弹出 - 依次回到上层栈帧,每一层都拿到子结果、计算当前值、打印返回信息,直到
factorial(5)的栈帧完成计算并返回120,栈清空
这样就能完整展示递归**调用(压栈)和返回(出栈)**两个阶段的完整执行过程了。
内容的提问来源于stack exchange,提问作者miatech
相关产品推荐
相关产品推荐

