尽管不是无限的,递归函数会导致溢出
我写的以下函数导致程序因堆栈溢出而崩溃,尽管递归是有限的。
public static void Key(char[] chars, int i, int l, string str) {
string newStr=null;
for(int j=0; j<l; j++)
newStr+=chars[i/(int)Math.Pow(68, j)%68];
if(newStr==str)
return;
Key(chars, ++i, l, newStr);
}
当我用这些参数调用方法时,一切正常:
Key(chars, 0, 4, "aaaa");
但是当涉及更多的调用时,它会抛出StackOverflowException
。 所以我认为问题在于方法是有限的,调用堆栈在方法的工作完成之前被填满。 所以我有几个问题:
为什么函数不能从栈中清除,它们不再需要,它们不会返回任何值。
如果是这样,有没有办法我可以手动清除堆栈? 我尝试了StackTrace
类,但在这种情况下它很无助。
1)该功能在结束执行时清除。 在本身调用Key意味着每次调用它都会在堆栈中,直到最后一次调用结束,在这个阶段它们将以相反的顺序结束。
2)您无法清除堆栈并继续通话。
堆栈仍然有限。 对于标准的C#应用程序,它是1 MB。 对于ASP,它是256 KB。 如果你需要更多的堆栈空间,你会看到异常。
如果您自己创建线程,则可以使用此构造函数调整堆栈大小。
或者,您可以重写您的算法,以便在不使用递归的情况下跟踪状态。
它看起来像NewStr == Str的退出条件永远不会发生,最终,您将用完堆栈。
链接地址: http://www.djcxy.com/p/80617.html上一篇: Recursive function causing an overflow despite it's not infinite
下一篇: Why does the F# compiler not create a tail call for this function?