1. 程式人生 > >【java筆記】遞迴次數過多導致堆疊溢位

【java筆記】遞迴次數過多導致堆疊溢位

在寫一個演算法中,由於遞迴呼叫次數過多,堆疊溢位。
堆疊的大小是系統控制的,無法改變。
如果遞迴調用出現問題,可以考慮採取迴圈的方式來解決,將需要的資料在關鍵的呼叫點儲存下來使用。簡單的說,就是用自己的資料儲存方法來代替系統遞迴呼叫產生的堆疊資料。

----------------------------------------------------------------------------------------------------------------------------------------------------

溢位的意思就是越界,作業系統會給每個程序分配一個最大上限的堆疊空間,如果超過了這個記憶體空間大小程式就會coredump,就像你建立一個太大的陣列會崩潰一樣,因為這裡堆溢位了。

作業系統分配給一個程序的棧空間是2M,堆空間在32位機器上是4G。如果你的程序的棧空間使用超過了2M就會棧溢位,堆使用超過4G就會堆溢位。

那麼遞迴為什麼會導致棧溢位呢?相信大家知道棧的出入規則,就像一個瓶子,方法壓棧執行,先進後出,遞迴的話那麼先入的不能出棧,會存在棧空間中,這樣就容易導致棧滿而溢位。

每當你呼叫一個方法,在這個方法執行前都會將之前的記憶體地址(也就是呼叫點)入棧,等被呼叫的方法執行完將地址出棧,程式根據這個資料返回呼叫點。
若遞迴呼叫次數太多,就會只入棧不出棧,於是堆疊就被壓爆了,此為棧溢位。

遞迴函式呼叫的太深,需要太多的記憶體,遞迴裡用到的區域性變數儲存在堆疊中,堆疊的訪問效率高,速度快,但空間有限,遞迴太多變數需要一直入棧而不出棧,導致需要的記憶體空間大於堆疊的空間。

------------------------------------------------------------------------------------------------------------------------------------------------------

-----------------------------------------------------------------------------------------------------------------------------------------------------

尾遞迴