7.小結
8.參考
遞迴是一種程式設計技巧,在許多資料結構和演算法中都用了遞迴進行實現,如果要學習後面相對比較複雜的資料結構與演算法,掌握遞迴非常重要。
我們先來看乙個例子,比如我們在電影院看電影,想知道自己坐在第幾排,但是電影院太黑沒法自己數,於是我們問前面的人他在第幾排,但是前面的人也不知道,所以他也問前面的人,依次類推,直到問到第一排的人,然後再一排一排的把數字傳回來,每次加 1,最後你就知道具體在哪一排了。
這就是乙個非常標準的遞迴求解問題的分解過程,去問的過程叫做 「遞」,回答的過程叫做 「歸」。
大部分遞迴問題都可以用遞迴公式進行表示,以上面電影院的例子來說。遞迴公式如下:
f (n
)=f(
n−1)
+1
f(n) = f(n-1)+1
f(n)=f
(n−1
)+1 其中,f(1
)=
1f(1) = 1
f(1)=1
有了上面的公式,我們就可以寫出遞迴的**
private
static
intf
(int n)
return
f(n -1)
+1;}
那究竟什麼樣的問題可以用遞迴來解決呢?只要同時滿足以下三個條件,就可以用遞迴來解決。
1.乙個問題的解可以分解為幾個子問題的解
何為子問題?子問題就是資料規模更小的問題。比如,前面講的電影院的例子,你要知道,「自己在哪一排」的問題,可以分解為「前一排的人在哪一排」這樣乙個子問題。
2.這個問題與分解之後的子問題,除了資料規模不同,求解思路完全一樣
比如電影院那個例子,你求解「自己在哪一排」的思路,和前面一排人求解「自己在哪一排」的思路,是一模一樣的。
3.存在遞迴終止條件
把問題分解為子問題,把子問題再分解為子子問題,一層一層分解下去,不能存在無限迴圈,這就需要有終止條件。
還是電影院的例子,第一排的人不需要再繼續詢問任何人,就知道自己在哪一排,也就是 f(1
)=
1f(1)=1
f(1)=1
,這就是遞迴的終止條件。
有了上面的理論,我們再分析乙個遞迴的例子,假設有 n 個台階,每次可以跨 1 個台階或者 2 個台階,走完這個 n 個台階有多少種走法?
我們先分析最簡單的
假設 n = 1,那麼我們只有一種走法,走 1 個台階。
假設 n = 2,那麼我們只有兩種走法,走兩次 1 個台階或者一次走 2 個台階。
假設 n = 3,我們現在已經走了第一步了,如果第一步走了 1 個台階,那麼我們需要考慮剩下的 2 個台階的走法,其實就是 n=2 的走法,如果第一步走了 2 個台階,那麼我們只能走一步,也就是 n=1的走法,所以可以得到公式:f(3
)=f(
2)+f
(1
)f(3) =f(2)+f(1)
f(3)=f
(2)+
f(1)
。假設現在有 n 階台階,我們的走法,就是 n-1 階的走法加上 n-2 階的走法
用遞迴公式表示
f (n
)=f(
n−1)
+f(n
−2
)f(n)=f(n-1)+f(n-2)
f(n)=f
(n−1
)+f(
n−2)
有了遞迴公式,接下來我們需要找到遞迴終止的條件
終止條件有兩個
最終的**如下:
private
static
intf
(int n)
if(n ==2)
return
f(n -1)
+f(n -2)
;}
我們是否可以將遞迴**改寫成非遞迴代價呢?
private
static
intf2
(int n)
return res;
}
private
static
intf2
(int n)
if(n ==2)
int res =0;
int n_minus_1 =2;
// 假設 n=3,n-1=2 個台階有2種走法
int n_minus_2 =1;
// 假設 n=3,n-2=1 個台階有1種走法
for(
int i =
3; i <= n; i++
)return res;
}
通過上面兩個例子可以看出,非遞迴的寫法,不僅多出很多**,而且非常難以理解,但是本質上和遞迴是一樣的,只是"手動"進行遞迴。
遞迴有利有弊,利是遞迴**的表達力很強,寫起來非常簡潔;而弊就是空間複雜度高、有堆疊溢位的風險、存在重複計算、過多的函式呼叫會耗時較多等問題。
資料結構第七章
平衡二叉樹 基本思想 在構造二叉排序樹的過程中,每插入乙個 結點時,首先檢查是否因插入而破壞了樹的平衡性,若是,則找出最小不平衡子樹,在保持二叉排序樹特 性的前提下,調整最小不平衡子樹中各結點之間的鏈 接關係,進行相應的旋轉,使之成為新的平衡子樹 平衡二叉樹 或者是一棵空的二叉排序樹,或者是具 有下...
PTA資料結構與演算法 第七章 排序
1 1僅基於比較的演算法能得到的最好的 最壞時間複雜度 是o nlogn t 對n個記錄進行快速排序,在最壞的情況下,其時間複雜度是o nlogn 1 2對n個記錄進行簡單選擇排序,比較次數和移動次數分別為o n2 和o n t1 3 對n個不同的資料採用氣泡排序進行從大到小的排序,當元素基本有序時...
資料結構筆記(第七章)
線性表的查詢技術 1 順序查詢 基本思想 從線性表的一端向另一端逐個將關鍵碼與 給定值進行比較,若相等,則查詢成功,給出該記錄 在表中的位置 若整個表檢測完仍未找到與給定值相 等的關鍵碼,則查詢失敗,給出失敗資訊。順序查詢 線性查詢 int seqsearch1 int r int n,int k ...