1. 程式人生 > >3.4.4 利用棧將遞歸轉換成非遞歸的方法

3.4.4 利用棧將遞歸轉換成非遞歸的方法

編制 img 處理 利用 根據 lock 題意 com 容易

在函數執行時系統需要設立一個“遞歸工作棧”存儲第一層遞歸所需的信息,此工作棧是遞歸函數執行的輔助空間,所以可以看出,遞歸程序在執行時需要系統提供隱式棧這種數據結構來實現,對於一般的遞歸過程,仿照遞歸算法執行過程中遞歸工作棧的狀態變化可直接寫出相應的非遞歸算法。這種利用棧消除遞歸過程的步驟如下。
(1)設置一個工作棧存放遞歸工作記錄(包括實參、返回地址及局部變量等)
(2)進入非遞歸調用入口(即被調用程序開始處)將調用程序傳來的實在參數和返回地址入棧(遞歸程序不可以作為主程序,因而可認為初始是被某個調用程序調用)。
(3)進入遞歸調用入口:當不滿足遞歸結束條件時,逐層遞歸,將實參、返回地址及局部變量入棧,這一過程可以通過循環語句來實現———模擬遞歸分解過程。
(4)遞歸結束條件滿足,將到達遞歸出口的給定常數作為當前的函數值。
(5)返回處理:在棧不空的情況下返回退出棧頂記錄,根據記錄中的返回地址進行題意規定的操作,即逐層計算當前函數值,知道棧空為止————模擬遞歸求值過程。
通過以上步驟就可以將遞歸算法改寫成非遞歸算法。 最終要的是每一層遞歸信息構成一個工作記錄,其中包括所有的實參,所有的局部變量,以及上一層的返回地址。每進入一層遞歸就產生一個新的工作記錄壓入棧頂。沒退出一層遞歸就從棧頂彈出一個工作記錄。 改寫後的算法具有如下特點:結構不清晰,可讀性差,有的還需要經過一系列優化。【案例見《數據結構》嚴蔚敏 C語言 第二版 5.5.1節中二叉樹中序遍歷的非遞歸算法】。 遞歸算法的特點:結構清晰,程序易讀,而且其正確性容易證明。 而且遞歸算法中將遞歸工作棧交給了系統來管理,而非遞歸則把編制程序的內存交給了程序員管理。
【課本講解】

技術分享圖片

技術分享圖片

技術分享圖片

技術分享圖片

技術分享圖片

3.4.4 利用棧將遞歸轉換成非遞歸的方法