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)方法。这是递归的深度优先特性:程序会先沿着递归链一直走到终止条件,再逐层回溯执行递归调用之后的代码。
具体执行流程
递归向下阶段:
- 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)直接返回,不执行后续代码
- Main方法调用
回溯执行阶段:
- 从最后一层递归
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
- 从最后一层递归
关于
Main---1的说明:- Main中的
a是类的静态成员变量,而ab、b方法中的a是方法的局部参数,二者完全独立 - Main中
a = 1是给静态变量赋值,但后续所有操作都只修改局部参数a,静态变量a始终保持为1,因此最后输出Main---1
- Main中的
理解确认
你观察到b方法输出与ab方法相反的结论完全正确,本质原因是递归的深度优先执行机制:先完成所有向下的递归调用,再回溯执行后续的b(a),导致b的输出顺序与ab的正向递归输出完全相反。
内容的提问来源于stack exchange,提问作者Jeswin Pathrose
相关产品推荐
相关产品推荐

