下面的函数我写了导致程序崩溃是由于堆栈溢出,虽然递归是有限的。递归函数引起溢出,尽管它不是无限
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
类,但在这种情况下它是无助的。
我得到的印象很深刻,你不明白堆栈是什么或它有什么作用。请仔细研究,您的问题应该自行解答。 – asawyer 2013-04-05 18:46:44
从技术上讲,你的代码是尾递归的,如果你用c#优化来构建它,你永远不会有堆栈溢出,你应该只是得到一个无限循环(如果你的基本情况实际上永远不会被打)。尝试开启优化,看看你是否仍然堆栈溢出 – devshorts 2013-04-05 18:50:09
也许你应该试图描述你想要完成这个看起来真的不必要的过于复杂 – 2013-04-05 18:55:53