Java递归程序中数字1重复输出的原因解析
理解递归代码的执行流程:为什么会重复输出1?
别担心,咱们一步步拆解这段代码的每一次调用,就能搞清楚数字1重复出现的原因了!
首先先把你的代码贴出来方便参考:
public class ProceduralProgramming { public static void main(String[] args) { fact(3); } public static void fact(int n) { if (n>=1) { fact(n-1); fact2(n); fact(n-1); } } public static void fact2(int n) { System.out.println(n); } }
核心逻辑梳理
fact(n)的规则很简单:当n≥1时,会按顺序做三件事:
- 递归调用
fact(n-1) - 调用
fact2(n)输出当前的n - 再次递归调用
fact(n-1)
咱们从main里的fact(3)开始,逐层追踪每一步的执行:
第一步:执行fact(3)
因为3≥1,所以按顺序执行:
- 先调用
fact(2) - 然后调用
fact2(3)输出3 - 最后再调用
fact(2)
先深入第一个fact(2)的执行:
第二步:执行第一个fact(2)
2≥1,按顺序执行:
- 调用
fact(1) - 调用
fact2(2)输出2 - 调用
fact(1)
先看第一个fact(1):
第三步:执行第一个fact(1)
1≥1,按顺序执行:
- 调用
fact(0):0<1,不满足条件,直接返回(啥也不做) - 调用
fact2(1)输出1 - 调用
fact(0):同样直接返回
→ 这一步输出了1
回到fact(2),接下来执行fact2(2),输出2
然后执行第二个fact(1),和刚才的流程完全一样:
→ 又输出了1
所以第一个fact(2)执行完,累计输出是:1 2 1
第四步:回到fact(3),执行fact2(3)
输出3,现在累计输出:1 2 1 3
第五步:执行第二个fact(2)
这个fact(2)的执行流程和第一个完全相同,又会输出:1 2 1
最终输出汇总
把所有步骤的输出连起来,就是你看到的:1 2 1 3 1 2 1
为什么1会重复这么多次?
本质是因为每次调用fact(n)都会触发两次fact(n-1)的递归:
- 对于
fact(1):两次fact(0)都是空操作,所以只会输出1次1 - 对于
fact(2):会调用两次fact(1),所以会输出2次1 - 对于
fact(3):会调用两次fact(2),每个fact(2)又输出2次1,所以总共输出4次1
这样是不是就清晰多了?递归的关键就是要跟踪每一层调用的顺序和返回时机,把每一步拆解开就不会晕啦!
内容的提问来源于stack exchange,提问作者ARG
相关产品推荐
相关产品推荐

