下面的函數我寫了導致程序崩潰是由於堆棧溢出,雖然遞歸是有限的。遞歸函數引起溢出,儘管它不是無限
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