1. 程式人生 > >《程式設計師的數學》:漢諾塔問題(Hanoi問題)的遞迴演算法與非遞迴演算法總結

《程式設計師的數學》:漢諾塔問題(Hanoi問題)的遞迴演算法與非遞迴演算法總結

從被呼叫函式返回呼叫函式前,系統也應完成3件事:
①儲存被呼叫函式的結果;
②釋放被呼叫函式的資料區;
③依照被呼叫函式儲存的返回地址將控制轉移到呼叫函式。

當有多個函式構成巢狀呼叫時,按照“後呼叫先返回”的原則(LIFO),上述函式之間的資訊傳遞和控制轉移必須通過“棧”來實現,即系統將整個程式執行時所需的資料空間安排在一個棧中,每當呼叫一個函式時,就為其在棧頂分配一個儲存區,每當從一個函式退出時,就釋放其儲存區,因此當前執行函式的資料區必在棧頂。堆疊特點:LIFO,除非轉移或中斷,堆疊內容的存或取表現出線性表列的性質。正是如此,程式不要求跟蹤當前進入堆疊的真實單元,而只要用一個具有自動遞增或自動遞減功能的堆疊計數器,便可正確指出最後一次資訊在堆疊中存放的地址。

一個遞迴函式的執行過程型別於多個函式的巢狀呼叫,只是呼叫函式和被呼叫函式是同一個函式。因此,和每次呼叫相關的一個重要的概念是遞迴函式執行的“層次”。假設呼叫該遞迴函式的主函式為第0層,則從主函式呼叫遞迴函式為進入第1層;從第i層遞迴呼叫本函式為進入下一層,即i+1層。反之,退出第i層遞迴應返回至上一層,即i-1層。為了保證遞迴函式正確執行,系統需設立一個“遞迴工作棧”,作為整個遞迴函式執行期間使用的資料儲存區。每一層遞迴所需資訊構成一個“工作記錄”,其中包括所有實參、所有區域性變數以及上一層的返回地址。每進入一層遞迴,就產生一個新的工作記錄壓入棧頂。每退出一層遞迴,就從棧頂彈出一個工作記錄,則當前執行層的工作記錄必是遞迴工作棧棧頂的工作記錄,稱這個記錄為“活動記錄”,並稱指示活動記錄的棧頂指標為“當前環境指標”。遞迴原始碼如下:
#include<stdio.h> 
/*主程式*/
int hanoi(int,char,char,char);
int main()
{
char a='A',b='B',c='C';
int dishes;