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

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时,会按顺序做三件事:

  1. 递归调用fact(n-1)
  2. 调用fact2(n)输出当前的n
  3. 再次递归调用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 08:01:55