1. 程式人生 > 實用技巧 >淺談遞迴的機器實現

淺談遞迴的機器實現

遞迴在計算機中是如何實現的 ? 換句話說,它最終被編譯成什麼樣的機器語言 ? 這就要從函式呼叫說起。實際上,一臺典型的32位計算機採用 “堆疊結構” 來實現函式呼叫,它在組合語言中,把函式所需的第k個,第k - 1個,..第1個引數依次入棧,然後執行call(address)指令。該指令把返回地址(當前語句的下一條語句的地址)入棧,然後跳轉到address位置的語句。在函式返回時,它執行ret指令。該指令把返回地址出棧,並跳轉到該地址繼續執行。

對於函式中定義的C + 區域性變數,在每次執行call與ret指令時,也會在“棧”中相應地儲存與復原,而作用範圍超過該函式的變數,以及通過new和malloc函式動態分配的空間則儲存在另一塊稱為 “堆”(注意, 這個堆與我們所說的二“暫存器 , 完成。的概念)的結構中。棧指標、 返回值、區域性的運算會藉助CPU的 ”暫存器“

完成

  1. 區域性變數在每層遞迴中都佔有 - 份空間, 宣告過多由此我們可以得知 : 或遞迴過深就會超過“棧”
    所能儲存的範圍,造成棧溢位。
  2. 非區域性變數對於各層連歸都共享同份空間,需要及時維護、還原現場,以防止在各層遞迴之間儲存和讀取的資料互相影響。

瞭解了遞迴的機器實現之後,我們就可以使用模擬的方法,把遞迴程式改寫為非遞迴程式。具體來說,我們可以使用一個數組來模擬棧,使用變數來模擬棧指標和返回值,使用 switch / case 或者goto / label 來模擬語句跳轉。