基本思路:將遞迴過程**現遞迴呼叫的地方,用等價的非遞迴**來代替,並對return語句做適當處理。
13條規則:處理直接遞迴呼叫中的遞迴**和return語句,將之轉化成等價的迭代**。
初始在開始,插入說明為棧的**並將其初始化為空。在一般情況下,這個棧用來存放引數、區域性變數和函式的值、每次遞迴呼叫的返回位址。
將標號l1附於第一條可執行語句。然後對於每一處遞迴呼叫都用一組下列規則的指令來代替。
遞迴呼叫語句
將所有引數和區域性變數的值存入棧。棧頂指標可作為乙個全程變數來看待。
簡歷第i個新標號li,並將i存入棧。這個標號的i值將用來計算返回位址。
此標號放在規則7所描述的程式段中
計算這次呼叫的各實在引數的值,並把這些值賦給相應的形式引數。
插入一條無條件轉向語句轉向過程的開始部分:goto l1
如果這過程是函式,則對遞迴過程中含有此次函式呼叫的那條語句做如下處理:將該語句的此次函式呼叫部分用從棧頂取回該函式值的**來代替,其餘部分的**按照原描述方式照抄,並將4中建立的標號附於這條語句上。如果不是函式,也將4中建立的標號附於6所產生的轉移語句後面的語句。
return處理
如果棧為空,則執行正常返回
否則,將所有輸出引數(帶有返回值的出口引數,out/inout型)的當前值賦給棧頂上的那些對應的變數。
如果棧中有返回位址標號的下標,就插入一條此下標 從棧中推出的**,並把這個下標賦給乙個未使用的變數。
從棧中退出所有區域性變數和引數的值並把他們賦給對應的變數。
如果這個過程是函式,則插入一下命令,這些指令用來計算緊接在return後面的表示式並將結果值存入棧頂。
用返回位址標號的下標實現對該標號的轉向。
示例:
求陣列元素中的最大值
演算法1.10 遞迴求取陣列元素的最大值
procedure max1(i)
// 查詢陣列a中最大值元素,並返回該元素的最大下標。//
global integer n,a(1:n),j,k
integer i
if i a(j) then k←i
else k←j
endif
else k←n
endif
return(k) //遞迴呼叫的返回//
end max1
消去上例中的遞迴:
procedure max2(i)
local integer j,k;global integer n,a(1:n)
integer i
integer stack(1:2*n)
top<-0 //規則1,宣告棧的**,並初始化為空
l1:if ia(j) then k<-i
else k<-j
endif
else k<-n
endif
if top=0 then return(k)//規則8,如果棧空,則正常返回
else addr<-stack(top);top<-top-1;//規則10,從棧中退出返回標號
i<-stack(top);top<-top-1;//規則11,從棧中退出區域性變數和引數的值
top<-top+1;stack(top)<-k;//規則12.計算返回值,並將之入棧
if addr=2 then goto l2 endif//規則12,用返回位址標號的下標實現對該標號的轉向
endif
end max2
計算機基礎教程13 可用課程
如今,各種型別的課程由教育機構提供。以下是一些常見課程和重要課程。課程名稱 持續時間 年 最低資格 bca計算機應用學士 310 2 pgd ca 計算機應用研究生文憑1畢業 mca計算機應用碩士3畢業 理學士 cs 理學學士 電腦科學 310 2 碩士 cs 理學碩士 電腦科學 2畢業 b.tec...
翻譯 計算機幾何基礎演算法(三)
凸包 對於一組點,能將所有點包含在內的最小的凸多邊形就是所謂的凸包。這個凸包是有該組點中的若干點組成的。可以想象這些點是一塊板上釘的釘子,用乙個彈性很好的橡皮筋箍住所有的點,那麼這條橡皮筋所形成的多邊形就是凸包。有很多種不同的演算法可以計算凸包,本文中,我們將討論其中一種演算法,該演算法在大多數情況...
計算機基礎1 3 作業系統 常見問題
程序與執行緒的區別?程序通訊方式?記憶體池 執行緒池 程序池 死鎖的概念 導致的原因 解決的辦法 死鎖檢測 系統週期性的檢測迴圈等待條件 什麼是實時排程系統?中斷和輪詢?這裡中斷是指cpu與外設通訊 臨界資源 臨界區 試寫出程式與程序的區別 1 程序是乙個動態概念,而程式是乙個靜態概念。2 程序具有...