尽管不是无限的,递归函数会导致溢出

我写的以下函数导致程序因堆栈溢出而崩溃,尽管递归是有限的。

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?