遞迴:如果在乙個函式、過程或資料結構的定義又應用了它自身,那麼這個函式、過程或資料結構稱是遞迴定義的,簡稱遞迴。遞迴最重要的是遞迴式和遞迴邊界。
簡化說明:
@乙個函式呼叫自己
@函式中有終止條件
@通過符號來連線返回的函式
用棧解釋: 斐波那契數列
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,請返回逆序後的棧。測試樣...