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

递归方法中参数值交换的逻辑疑问 | 附C#代码及运行输出

理解递归中的参数交换逻辑

嘿,我来帮你拆解这段递归代码里参数a和b的变化逻辑——核心点其实是递归调用的参数是「值拷贝」,每个递归层级都有自己独立的参数副本,这是解开困惑的关键!

我们一步步跟着栈的调用顺序来梳理:

递归调用的栈执行流程

初始调用是Method(3, 1, 2),这是栈的第一层。接下来每一层的调用和执行都会按栈的「先进后出」顺序进行:

  1. 第一层(初始调用):Method(3, 1, 2)

    • 因为flowerInVase=3>0,所以调用下一层递归:Method(3-1, b=2, a=1) → 也就是Method(2, 2, 1),此时进入栈的第二层。
  2. 第二层:Method(2, 2, 1)

    • flowerInVase=2>0,继续调用下一层:Method(2-1, b=1, a=2) → Method(1, 1, 2),进入栈的第三层。
  3. 第三层:Method(1, 1, 2)

    • flowerInVase=1>0,调用下一层:Method(1-1, b=2, a=1) → Method(0, 2, 1),进入栈的第四层。
  4. 第四层:Method(0, 2, 1)

    • flowerInVase=0,不满足递归条件,直接返回,栈开始「出栈」执行后续代码。

栈出栈时的执行过程

现在从最底层的递归开始往回执行Console.WriteLine:

  • 回到第三层:这一层的参数是flowerInVase=1、a=1、b=2(这是当初调用第三层时传入的独立副本),所以输出:1, 1 ,2,执行完返回。
  • 回到第二层:这一层的参数是flowerInVase=2、a=2、b=1(同样是第二层自己的参数副本,没被其他层级修改),输出:2, 2 ,1,执行完返回。
  • 回到第一层:这一层的参数是初始的flowerInVase=3、a=1、b=2,输出:3, 1 ,2,执行完结束。

关键总结

你可能误以为递归时a和b是在同一个变量上交换,但实际上:

  • 每次递归调用都会创建新的参数副本,传递的是当前层a和b的「值」,而不是变量本身。
  • 下一层的a和b是当前层b和a的值,但当前层自己的a和b完全不受影响,等递归返回来时,依然用自己的参数值执行后续代码。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 09:29:55