棧與遞迴 2018 01 07思考

2021-08-14 10:00:17 字數 1583 閱讀 3031

繼昨天寫完棧的簡單應用——四則運算之後,我對棧的興趣又變濃了,尤其是昨天在看到棧與遞迴這個問題時,心中更是一咯噔,我們都知道遞迴對記憶體的耗費是比較大的,而計算機在函式呼叫過程中與棧相似,因此遞迴是可以通過棧來實現的,從而提高效率(當然迴圈有時候也是可以實現的,可是我就想用棧,你管我~),所以在我下午吃了一下午雞(跳了一下午傘)之後,「良心備受譴責」,特意晚上重回圖書館。回到圖書館後本來是打算接著早上的「圖」開始繼續學習的,可是我對棧實現遞迴的熱愛不允許我去繼續看「圖」,所以我才來到這裡,寫一篇關於棧的應用——遞迴。

在學完計算機系統基礎之後,我對計算機的原理又有了新的認識(其實以前什麼都不知道

剛剛思考了半天,沒想出來,於是看了一篇部落格:多謝這位牛人指點迷津。

下面我以斐波那契數列為例來寫一下對棧實行遞迴的理解:

遞迴實現的過程:

1.將乙個大問題轉化為小問題:f(4)=f(3)+f(2);

2.小問題是否可以求解,若不能,繼續轉化:f(3)=f(1)+f(2);

3.小問題可以求解,返回問題的解:f(3)=f(1)+f(2)=1+1=2;

4.繼續返回問題的解直到求出大問題的解:f(4)=f(3)+f(2)=2+1=3;

問題的本質:f(4)=f(3)+f(2)=f(2)+f(1)+f(2);

int fib(int n)
棧實現:

1.將大問題入棧:f(4);棧狀態[f(4)]

2.彈出棧頂(大問題):f(4);棧狀態[ ]

3.無法求解大問題,將大問題分解:f(4)=f(3)+f(2),併入棧f(2),f(3)(注意:此問題對先後入棧先後順序沒有要求,但某些問題有先後順序要求,應將先執行的後入棧,再次強調,注意順序!);棧狀態[f(2) f(3)]

4.彈出棧頂元素(大問題,注意這個大問題是相對於可以直接解決的問題來講,實際上已經是小問題了):f(3);棧狀態[f(2)]

5.無法求解大問題,將大問題分解:f(3)=f(2)+f(1),併入棧;棧狀態[f(2) f(2) f(1)]

6.彈出棧頂元素:f(1),可解決,進行操作:result+=f(1)=1;(不同問題的操作不相同,此問題實際上是求和,因此為『+』);棧狀態[f(2) f(2)]

7.繼續彈出...基本方法已經說明,後面省略

int fib_stack(int cur) 

else //注意順序,某些問題對執行順序有要求

} return result;

}

總結:遞迴呼叫無非就是重複呼叫自身來重複某乙個動作,函式的引數即為這個動作的資料,因此我們利用棧實現遞迴只需要利用棧來儲存這個動作所用的資料,然後再取出資料來執行這個動作。

int fib(int n)

int result=0;

void f(int n)

int fib_stack(int m)

}}

遞迴函式與棧

關於函式呼叫與棧的關係 鏈結 下面是在函式呼叫與棧的關係的基礎上,為了解遞迴呼叫的筆記。為了方便描述,將乙個函式f x 的棧幀以下圖的方式進行簡化 並用乙個求階乘的函式來解釋遞迴函式與棧的聯絡 int fun int n intmain int argc,char argv 首先程式從主函式開始,第...

遞推與遞迴 棧

棧是計算機中經典的資料結構,簡單的說,棧就是限制在一端進行插入刪除操作的線性表。棧有兩種最重要的操作,即 pop 從棧頂彈出乙個元素 和 push 將乙個元素進棧 棧的重要性不言自明,任何一門資料結構的課程都會介紹棧。寧寧同學在複習棧的基本概念時,想到了乙個書上沒有講過的問題,而他自己無法給出答案,...

遞迴問題思考與覆盤

遞迴問題實際上是將乙個大的問題分解成幾個小的問題,然後將小的問題再次分為更小的問題,然後就這樣重複操作下去最後到最小的問題我們能夠解決,然後再解決上乙個較小的問題,直到解決這個大問題。舉個栗子 我們面試的時候可能會遇到這個問題,走樓梯,你一次只能上一層台階或者兩層,那麼走到第n層有幾種走法呢。思考 ...