遞迴與棧的關係

2021-05-23 13:10:05 字數 1226 閱讀 2426

遞迴與棧

遞迴是乙個重要的概念,同時也是一種重的程式設計方法。簡單地說,如果在乙個函式、過程或資料結構的定義中又應用了它自身(作為定義項之一),那麼這個函式、過程或資料結構稱為是遞迴的定義的,簡稱遞迴。例如,階乘函式可遞迴定義如下:

必須注意,遞迴定義不能是"迴圈定義"。為此要求任可遞迴定義必須同時滿足如下兩個條件:

①被定義項在定義中的應用(即作為定義項的出現)具有更小的"尺度";

②被定義項在最小"尺度"上的定義不是遞迴的。

例如,在上述階乘函式的定義中,被定義項n!在定義中的應用(n-1)!具有比原來(即n)更小的"尺度"(即n-1)。同時,n!在最小"尺度"(即0)上的定義不是遞迴的(由自然數1直接定義)。這兩個條件實際上構成了遞迴程式設計的基本原則。此外,通常將反映條件②的部分寫在遞迴過程的開頭。

很多實際遞迴定義的。對於這些問題很容易寫出求解它們的遞迴演算法。計算階乘函式的遞迴演算法如下:

遞迴過程的執行引起遞迴呼叫。例如,f(3)的執行中出現的遞迴呼叫——返回過程如圖3-5(a)所示。f3│

↓r└①┌┌┈┘

┈┘f2→┐↓

t└②┌ 

┌┈┘ 

┈┘f1→┐↓

t└③┌ 

┌┈┘ 

┈┘f0→┐│

│r1┌│↓

←┐└┈┐ 6⑥└

t1┌↓

┈┘←┐

└┈┐ 2⑤└

t1┌↓

┈┘←┐┈┈

└┈┐ 1④└

│↓┈┘1

圖3-5(a) f(3)執行遞迴呼叫─返回次序

top→ 3

rtop→ 2

r3rtop→1r

2r3r

top→ 2

r3rtop→ 3

rtop→

呼叫f2前

呼叫f2後

呼叫f1後

呼叫f0後

返回f1後

返回f2後

top→

返回f3後

圖3-5(b) 相應的工作棧狀態變化

遞迴呼叫——返回的控制與非遞迴過程的控制並無本質區別,同樣可由乙個工作棧實現。對上述過程f,返回位置r應設在內、外層return語句這間。為了區別返回到哪一級遞迴,可在返回位置進棧的同時將該次呼叫的引數一起儲存。圖3-5(b)所示為與(a)相應的工作棧狀態變化過程。

歡迎:

棧結構 和 遞迴 的關係

程式中的 函式呼叫棧 是棧資料結構的棧的一種應用。函式呼叫棧一般是從高位址向低位址增長的 棧底為記憶體的高位址處 棧頂為記憶體的低位址處 注意 程式中的棧空間可看做乙個順序棧的應用。棧儲存了乙個函式呼叫所需的維護資訊 因為程式中的棧結構是順序棧,因此,如果遞迴的次數過多,程式中的資料過大,在不斷的壓...

棧與遞迴的實現

對於棧有些問題還不是很熟悉,所以暫時需要些時間去理解,需要多寫些 去體會,棧還有乙個重要應用是在程式語言中實現遞迴,所以這次主要是講遞迴的實現,大家熟悉的階乘函式,2階fibonacci數列和ackerman函式等,其次還有的資料結構,如二叉樹 廣義表等,由於結構本身固有的遞迴特性,則它們的操作可遞...

棧與遞迴的實現

對於棧有些問題還不是很熟悉,所以暫時需要些時間去理解,需要多寫些 去體會,棧還有乙個重要應用是在程式語言中實現遞迴,所以這次主要是講遞迴的實現,大家熟悉的階乘函式,2階fibonacci數列和ackerman函式等,其次還有的資料結構,如二叉樹 廣義表等,由於結構本身固有的遞迴特性,則它們的操作可遞...