遞歸導致內存溢出
java裏面JVM的機制在調用函數的時候任然是進棧和出棧,所以極易導致棧內存溢出,錯誤類型
幾天寫的一段代碼就出現了這個問題。
大概結構是這樣的:
A(){
if(){}//遞歸終止條件
else(){
for(){
A();//這裏進行了一個遞歸,當for循環次數過多,而且遞歸終止條件難以達成的時候,棧內存就會溢出
}
}
}
摸索了很久(確實是摸索,網上的資料都不太合適,基本上原因知道了,但是解決方法都是說修改代碼,但是具體怎麼改沒有具體的例子),就這個結構的來說,換成下面的樣子就可以
A(){
if(){}
else{
B()
}
}
B(){
for(){
A()
}
}
比較兩種寫法,第一種寫法不斷的遞歸,函數嵌套層數過多最後導致棧內存溢出,而第二種寫法將循環的部分放到了另外一個函數,進入B的時候A已經結束了,其佔用的棧內存可以得到釋放,所以沒有過多的函數嵌套。
具體全面的遞歸優化請google,這裏只是我遇到的一種情況和自己的解決方法。共勉
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.