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

为何调用OofNSq递归方法时出现Stack Overflow异常?

为什么调用递归方法会出现Stack Overflow异常?

你的问题和int的取值范围完全无关,核心原因是递归调用耗尽了线程的栈内存,导致栈溢出。

递归的栈内存机制

每次调用OofNSq方法时,.NET运行时会在当前线程的调用栈上分配一个「栈帧」——用来存储方法的局部变量、返回地址、参数等信息。你的代码是从传入的n开始,一直递归调用到0,相当于要创建n个栈帧。

而.NET线程的默认栈大小是有限的(通常在1MB左右),当n大到一定程度(比如30728),累积的栈帧会把栈内存占满,这时就会抛出Stack Overflow异常。你提到的临界值(19271、30728)有波动,是因为不同环境下栈的可用空间会受系统、运行时版本、其他线程操作等因素影响,但本质都是栈帧数量超过了栈的承载极限。

为什么不是int溢出?

计算1到n的和公式是n*(n+1)/2,当n=50000时,结果是50000*50001/2=1250025000,这个值远小于int的最大值2147483647,所以确实和int的取值范围没关系。

解决办法

  1. 改成迭代实现:完全避免递归,不会占用额外的栈空间
public static int OofNSq(int n)
{
    int sum = 0;
    for (int i = 1; i <= n; i++)
    {
        sum += i;
    }
    return sum;
}
  1. 用数学公式直接计算:时间复杂度O(1),效率最高
public static int OofNSq(int n)
{
    return n <= 0 ? 0 : n * (n + 1) / 2;
}
  1. 尾递归尝试(不推荐):虽然某些语言支持尾递归优化,但C#默认情况下不一定会对尾递归做优化,所以这个方法可靠性低,不建议依赖。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.25 18:02:14