-
1 # 蔓莓愛素描
-
2 # 旅行的Java
要麼是你的遞迴函式寫的問題,終止條件。要麼就是你呼叫的次數實在太多。遞迴函式就有導致記憶體溢位的可能,函式呼叫,就是入棧,出棧過程,呼叫次數太多,導致入棧太深,記憶體一直不釋放,就GG了,慎用遞迴。
-
3 # 程式設計師Bob
遞迴每進入一次方法,會將上個方法的資料壓入棧中以便將來恢復繼續執行。
迴圈每次執行的時候,臨時變數都失效了,只有少量的全域性變數。
你的這個問題的原因是因為遞迴次數太多,導致棧記憶體耗盡。
-
4 # 品碼師
採用遞迴必須要有遞迴終止條件,為了防止棧溢位,遞迴深度最好不要太大,否則即使有正確的終止條件遞迴也會造成棧溢位。遞迴最常見的情形是二叉樹遍歷,程式碼簡單快捷。
-
5 # 網路圈
我們知道,在程式設計中如果想讓某個業務重複執行,一般有兩種實現方式,分別是:遞迴和迴圈。在實際編碼過程中,我們並不建議使用遞迴,反而是建議使用迴圈,這是為什麼呢?
遞迴不當會導致記憶體溢位其實不單單是Java,任何一款程式語言,如果遞迴寫法不對,那就可能導致記憶體溢位!
學過Java的朋友肯定或多或少都聽說和了解過棧記憶體和堆記憶體,程式在執行時,電腦作業系統會給每個程序都分配有堆記憶體、棧記憶體,所分配的堆疊記憶體都是有上限的,一旦超過了這個上限就會導致記憶體溢位現象。
為什麼遞迴操作容易導致記憶體溢位呢?原因主要有以下幾點:
遞迴方法體內,如果終止遞迴的條件寫錯了,那可能會導致無限遞迴,最終導致記憶體溢位;
即使遞迴方法及退出遞迴條件都是正常的,但若遞迴深度過深(遞迴次數過多),也會導致棧記憶體溢位!因為棧的出入規則是先入後出(先入棧的最後再出來),如果遞迴次數過多就會導致只入棧不出棧,最終棧記憶體溢位。
遞迴改迴圈可以降低記憶體溢位的可能注意,遞迴寫法改成迴圈寫法可以降低記憶體溢位的風險,但這不是絕對的,如果迴圈寫成了死迴圈一樣會導致記憶體溢位。
遞迴寫法改成迴圈寫法的好處是,不會在短時間內出現棧的只入不出現象,所以可以規避棧記憶體溢位現象。
回覆列表
幾天寫的一段程式碼就出現了這個問題。大概結構是這樣的:A(){ if(){}//遞迴終止條件 else(){ for(){ A();//這裡進行了一個遞迴,當for迴圈次數過多,而且遞迴終止條件難以達成的時候,棧記憶體就會溢位 } }} ------------- 如果我回答對你有幫助,請關注我一下。或有其他問題也可以關注我,給我發私信