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

C#递归方法调用执行顺序与输出逻辑解析求助

递归调用执行顺序与输出分析

问题代码与输出

C#代码片段

using System;

public class HelloWorld
{
    static int a = new int();
    public static void Main(string[] args)
    {
        ab(a = 1);
        Console.WriteLine("Main---" + a);
    }
    public static void ab(int a)
    {
        if (a != 10)
        {
            a++;
            Console.WriteLine("ab-----" + a);
            ab(a);
            b(a);
        }
    }
    public static void b(int a)
    {
        if (a < 10)
        {
            a++;
            Console.WriteLine("b-----------" + a);
        }
    }
}

程序输出结果

ab-----2
ab-----3
ab-----4
ab-----5
ab-----6
ab-----7
ab-----8
ab-----9
ab-----10
b-----------10
b-----------9
b-----------8
b-----------7
b-----------6
b-----------5
b-----------4
b-----------3
Main---1

用户疑问

注意到b方法的输出顺序与ab方法相反,原本预期b方法会和ab方法一样按升序输出,需要解释该现象的原因、递归调用的执行顺序,并确认行为理解是否正确。

核心解析

递归执行的核心逻辑

ab方法中,ab(a)递归调用会优先执行到底,只有当该递归调用完全结束后,才会执行后续的b(a)方法。这是递归的深度优先特性:程序会先沿着递归链一直走到终止条件,再逐层回溯执行递归调用之后的代码。

具体执行流程

  1. 递归向下阶段:

    • Main方法调用ab(a=1),进入ab方法后,局部变量a自增为2,输出ab-----2,接着调用ab(2)
    • 重复上述过程:每次进入ab方法都先自增局部变量a、输出ab-----x,再调用下一层ab(x)
    • 直到局部变量a变为10:输出ab-----10后调用ab(10),此时满足a != 10的终止条件,ab(10)直接返回,不执行后续代码
  2. 回溯执行阶段:

    • 从最后一层递归ab(10)返回后,回到上一层ab(9)的递归调用位置,执行b(9):局部变量a=9<10,自增为10,输出b-----------10
    • 接着回到ab(8)的递归调用之后,执行b(8):局部变量a=8<10,自增为9,输出b-----------9
    • 以此类推,逐层回溯执行每一层ab方法中ab(a)之后的b(a),直到回到最开始的ab(1)递归调用之后,执行b(2)(ab(1)中的局部变量a已自增为2),输出b-----------3
  3. 关于Main---1的说明:

    • Main中的a是类的静态成员变量,而ab、b方法中的a是方法的局部参数,二者完全独立
    • Main中a = 1是给静态变量赋值,但后续所有操作都只修改局部参数a,静态变量a始终保持为1,因此最后输出Main---1

理解确认

你观察到b方法输出与ab方法相反的结论完全正确,本质原因是递归的深度优先执行机制:先完成所有向下的递归调用,再回溯执行后续的b(a),导致b的输出顺序与ab的正向递归输出完全相反。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 05:22:36