1. 程式人生 > 其它 >遞迴演算法

遞迴演算法

技術標籤:資料結構與演算法資料結構遞迴演算法

一、遞迴的定義

  • 方法或函式呼叫自身的方式稱為遞迴呼叫,呼叫稱為遞,返回稱為歸。
  • 遞迴是一種非常高效、簡潔的編碼技巧,應用廣泛的演算法,比如DFS深度優先搜尋、前中後序二叉樹遍歷等都是使用遞迴

二、遞迴的應用

  • 1.遞迴的優缺點

優點:程式碼的表達力強,簡潔
缺點:空間複雜度高,存在重複計算,堆疊溢位

  • 2.遞迴可以解決的問題

1)問題的解可以分解為若干子問題
2)問題與子問題的求解思路一致
3)存在遞迴終止條件

三、遞迴的實現

  • 1)遞迴程式碼

找到將大問題分解為小問題的規律,寫出遞推公式,然後再推敲終止條件,最後將遞推公式和終止條件翻譯成程式碼。

  • 2)遞迴程式碼的理解

如果一個問題A可以分解為若干個子問題B、C、D,可以假設子問題B、C、D已經解決。而且,你只需要思考問題A與子問題B、C、D兩層之間的關係即可

四、遞迴問題及解決方案

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

例子

假如這裡有 n 個臺階,每次你可以跨 1 個臺階或者 2 個臺階,請問走這 n 個臺階有多少種走法?如果有 7 個臺階,你可以 2,2,2,1 這樣子上去,也可以 1,2,1,1,2 這樣子上去,總之走法有很多,那如何用程式設計求得總共有多少種走法呢?
我們仔細想下,實際上,可以根據第一步的走法把所有走法分為兩類,第一類是第一步走了 1 個臺階,另一類是第一步走了 2 個臺階。所以 n 個臺階的走法就等於先走 1 階後,n-1 個臺階的走法 加上先走 2 階後,n-2 個臺階的走法。用公式表示就是:


f(n) = f(n-1)+f(n-2)

n=2 時,f(2)=f(1)+f(0)。如果遞迴終止條件只有一個 f(1)=1,那 f(2) 就無法求解了。所以除了 f(1)=1 這一個遞迴終止條件外,我們可以把 f(2)=2 作為一種終止條件,表示走 2 個臺階,有兩種走法,一步走完或者分兩步來走


f(1) = 1;
f(2) = 2;
f(n) = f(n-1)+f(n-2)

寫遞迴程式碼的關鍵就是找到如何將大問題分解為小問題的規律,並且基於此寫出遞推公式,然後再推敲終止條件,最後將遞推公式和終止條件翻譯成程式碼