遞歸導致內存溢出

遞歸在分析問題的時候很方便,但是在寫實現的時候開銷卻很大,尤其是當遞歸層數太深的時候,內存就會溢出


java裏面JVM的機制在調用函數的時候任然是進棧和出棧,所以極易導致棧內存溢出,錯誤類型

java.lang.StackOverflowError錯誤


幾天寫的一段代碼就出現了這個問題。
大概結構是這樣的:
A(){
    if(){}//遞歸終止條件
    else(){
        for(){
            A();//這裏進行了一個遞歸,當for循環次數過多,而且遞歸終止條件難以達成的時候,棧內存就會溢出
        }
    }
}

摸索了很久(確實是摸索,網上的資料都不太合適,基本上原因知道了,但是解決方法都是說修改代碼,但是具體怎麼改沒有具體的例子),就這個結構的來說,換成下面的樣子就可以

A(){
  if(){}
  else{
    B()
  }
}
B(){
  for(){
    A()
  }
}

比較兩種寫法,第一種寫法不斷的遞歸,函數嵌套層數過多最後導致棧內存溢出,而第二種寫法將循環的部分放到了另外一個函數,進入B的時候A已經結束了,其佔用的棧內存可以得到釋放,所以沒有過多的函數嵌套。

具體全面的遞歸優化請google,這裏只是我遇到的一種情況和自己的解決方法。共勉
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章