計算機演算法基礎 13個法則消去遞迴

2021-10-02 05:38:30 字數 1742 閱讀 1074

基本思路:將遞迴過程**現遞迴呼叫的地方,用等價的非遞迴**來代替,並對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 程序具有...