用棧明白遞迴原理

2021-09-26 09:08:44 字數 684 閱讀 8724

遞迴:如果在乙個函式、過程或資料結構的定義又應用了它自身,那麼這個函式、過程或資料結構稱是遞迴定義的,簡稱遞迴。遞迴最重要的是遞迴式和遞迴邊界。

簡化說明:

@乙個函式呼叫自己

@函式中有終止條件

@通過符號來連線返回的函式

用棧解釋: 斐波那契數列

int

f(n)

if(n==1)

else

}

運用遞迴的時候,系統會有乙個函式棧儲存函式返回值,符號,區域性變數等。

推理:假設n=5,

入棧:第一步:f(5)入棧

第二步:f(4)入棧 f(3)入棧 「+」入棧

第三步:f(3)入棧 f(2)入棧 「+」入棧」 f(2)入棧 f(1)入棧 「+」入棧

第四步:f(2)入棧 f(1)入棧 「+」入棧 f(1)入棧 f(0)入棧 「+」入棧」 f(1)入棧 f(0)入棧 「+」入棧 f(0)入棧 1入棧 「+」入棧

第五步:f(1)入棧 f(0)入棧 f(0) 入棧 1入棧 「+」入棧 1入棧 0入棧 「+」入棧 1入棧 0入棧 「+」入棧 0入棧 1入棧 「+」入棧

出棧:第一步棧頂為 f(2)=0+1=1

第二步棧頂為 f(3)=1+1=2

第三步棧頂為 f(4)=1+2=3

第四步棧頂為 f(5) =2+3=5

用遞迴操作逆序棧 遞迴

乙個棧依次壓入1,2,3,4,5那麼從棧頂到棧底分別為5,4,3,2,1。將這個棧轉置後,從棧頂到棧底為1,2,3,4,5,也就是實現了棧中元素的逆序,請設計乙個演算法實現逆序棧的操作,但是只能用遞迴函式來實現,而不能用另外的資料結構。給定棧的大小n和乙個棧stack,請返回逆序後的棧。測試樣例 5...

用棧將遞迴轉化為非遞迴

在競賽中如果系統棧很小的話,過深的遞迴會讓棧溢位,這個時候我們就要自己手寫棧,將遞迴轉化成手工棧。方法其實也很簡單。基本思路上,我們就是用棧不斷的pop,push。但是何時push,何時pop呢?在 演算法導論 上對深度優先遍歷樹的講解中,在深度遍歷中,會對每個節點進行染色,白色為沒有被訪問過 灰色...

用遞迴函式和棧操作逆序棧

乙個棧依次壓入1,2,3,4,5那麼從棧頂到棧底分別為5,4,3,2,1。將這個棧轉置後,從棧頂到棧底為1,2,3,4,5,也就是實現了棧中元素的逆序,請設計乙個演算法實現逆序棧的操作,但是只能用遞迴函式來實現,而不能用另外的資料結構。給定乙個棧stack以及棧的大小top,請返回逆序後的棧。測試樣...