1. 程式人生 > >資料結構與算法系列8--遞迴

資料結構與算法系列8--遞迴

什麼是遞迴?

1.方法或函式呼叫自身的方式稱為遞迴呼叫,呼叫稱為遞,返回稱為歸。
2.遞迴是一種非常高效、簡潔的編碼技巧,一種應用非常廣泛的演算法,比如DFS深度優先搜尋、前中後序二叉樹遍歷等都是使用遞迴。
3.基本上,所有的遞迴問題都可以用遞推公式來表示,比如
f(n) = f(n-1) + 1;
f(n) = f(n-1) + f(n-2);
f(n)=n*f(n-1);

遞迴的優缺點?

優點:程式碼的表達力很強,寫起來很簡潔。
缺點:空間複雜度高,有堆疊溢位的風險;存在重複計算;過多的函式呼叫會耗時較多等問題。

什麼樣的問題適合用遞迴來解決呢?

一般的,一個問題只要滿足了以下3個條件,就可以用遞迴來解決:
1.問題的解可以分為幾個子問題的解。什麼是子問題?就是資料規模更小的問題。
2.問題與子問題之間,除了資料規模外,求解思路完全一樣。
3.存在遞迴終止條件。

如何編寫遞迴程式碼?

遞迴程式碼最重要的是找到如何將大問題分解為小問題的規律,由此總結出遞迴公式,再尋找寫出終止條件,最後將遞迴公式和終止條件翻譯成程式碼。
特別注意:
對於遞迴程式碼,若試圖想清楚整個遞和歸的過程,實際上是進入了一個思維誤區。
那我們該如何理解遞迴程式碼呢?
如果一個問題A可以分解為若干個子問題B、C、D,你可以假設子問題B、C、D已經解決。而且,你只需要思考問題A與子問題B、C、D兩層之間的關係即可,不需要一層層往下思考子問題與子子問題,子子問題與子子子問題之間的關係。遮蔽掉遞迴細節,這樣子理解起來就簡單多了。
因此,理解遞迴程式碼,就把它抽象成一個遞推公式,不用想一層層的呼叫關係,不要試圖用人腦去分解遞迴的每個步驟。

遞迴常見問題及解決方案

1.警惕堆疊溢位:可以宣告一個全域性變數來控制遞迴的深度,從而避免堆疊溢位。
2.警惕重複計算:通過某種資料結構來儲存已經求解過的值,從而避免重複計算。