通过递归的stackoverflow

Mat*_*n L 5 c# stack-overflow recursion exception

可能重复:
运行时异常,递归太深

我在开发ac#.net程序时遇到了问题,我把它简化为一个简单的问题,我需要理解为什么这个代码会抛出一个stackoverflow异常,如果我调用这样的函数:

CheckFunc(16000);
Run Code Online (Sandbox Code Playgroud)

但是如果我这样称它就可以正常工作

CheckFunc(1000);
Run Code Online (Sandbox Code Playgroud)

这是功能:

private void CheckFunc(Int32 i)
{
    if (i == 0)
        MessageBox.Show("good");
    else
        CheckFunc(i - 1);
}
Run Code Online (Sandbox Code Playgroud)

试图使代码尽可能简单...

我知道有一个堆栈溢出但堆栈?我怎样才能解决这个问题 ?

谢谢.

Tib*_*ibi 12

问题确实是堆栈溢出.

为什么会这样:

堆栈是一个特殊的内存区域,其中存储了一些东西:

  • 函数的局部变量
  • 功能参数
  • (最重要的是)函数返回地址.当您从函数返回时,这就是处理器知道返回的方式.

问题是这个存储区域是有限的.递归调用将在此堆栈上添加大量数据,并快速填充它.

如何解决:

有几种方法:

  • 减少变量的数量,如果你在递归函数中有一个本地数组,那你就是在寻找麻烦.
  • 减少函数的参数数量(这里显然不是这种情况)
  • 减少递归调用的次数.

如果这还不够,唯一的解决方案就是找到一个迭代解决方案.


Mat*_*son 11

这是因为你没有足够的堆栈空间来递归16000次.

递归应该几乎总是低于这个水平!否则,重写为循环.你不能以任何其他方式解决这个问题.