回覆列表
-
1 # 使用者6735885878998
-
2 # 使用者6521566432652
雖然我沒有親眼見到你的源程式程式碼,但是根據你所描述的情況來看,我估計你在你的程式原始碼中使用了遞迴呼叫子函式。因為程式在頻繁地遞迴呼叫子函式過程中就會產生頻繁地產生壓棧、出棧操作。
遞迴呼叫子函式的最大優點就是:程式的編寫起來較容易、並且程式的可讀性較好;但是它也有它的缺點。即:如果需要處理的資料量很大時,就必然會導致堆疊溢位的現象。此時就必須將遞迴演算法修改為非遞迴的演算法。
至於具體的修改方法,現在的資料結構教材上都有講解的。但是這樣一改,其程式的非遞迴可讀性必然不如遞迴呼叫的看起來可讀性要好。
例如:最最經典的遞迴呼叫子函式就是:計算一個整數的階乘。當需要計算的整數比較小的時候,那麼使用遞迴呼叫子函式來編寫程式,那簡直就是一種享受。但是當需要計算的整數很大、很大的時候,那麼如果還是使用遞迴演算法,必然會造成堆疊的溢位。此時就必須要把遞迴演算法修改為非遞迴演算法。
那麼過多的遞迴呼叫為什麼會引起棧溢位呢?事實上,函式呼叫的引數是透過棧空間來傳遞的,在呼叫過程中會佔用執行緒的棧資源。而遞迴呼叫,只有走到最後的結束點後函式才能依次退出,而未到達最後的結束點之前,佔用的棧空間一直沒有釋放,如果遞迴呼叫次數過多,就可能導致佔用的棧資源超過執行緒的最大值,從而導致棧溢位,導致程式的異常退出。