藍橋杯輔導視頻學習-經典遞歸問題

1、在n個球中,任意取出m個(不放回),求有多少種不同取法?

分析:(通過假設的方法把一個大問題分解成兩個小問題)
假設已經把所有取法全都羅列出來了,又假如在這些球中有一個我喜歡的球1號,那麼在這些所有的取法中, 有的取法中包含了球1號,有的沒有包含。那麼接下來把這些所有的取法分成兩種類型,一種類型是這些取法中包含了球1號,另一種類型的取法中是不包含球1號的。
(1)球1號取:在剩下的 n-1 中取出 m - 1 個球就能滿足要求了
get_ball( n - 1, m -1 )
(2)球1號不取:既然已經確定球1號不會被取走,那麼也就是在剩下的 n - 1 個球中取出 m 個球來滿足要求
get_ball( n - 1, m )

     尋找出口,停止遞歸:
     (1)從 n = 2個球中取出m = 3個球是不成立的,故 if (n < m)    return 0 ;
     (2)從 n = 2個球中取出 m = 2個球的取法只有一種,故 if ( n == m)   return 1 ;
     (3) get_ball( n - 1, m -1 )中 n 和 m 都在不停的減少, n 是大於 m 的(因爲小於和等於的情況已經在上面被排除了),當m=0時,n可能是大於0的,比如從 n = 5 個球中取出 m = 0個球,那麼只有一種取法,那就是什麼都不取,故 if (m == 0)   return 1 ; 

這裏寫圖片描述

2、求n個元素的全排列?

全排列:和組合不同。
分析
考慮問題從最簡單的開始,如abc,acb,bca,bac,cab,cba。
每次都把一個元素放在頭位置,剩下的元素進行全排列。
可以使用的一種方法,每次遞歸僅僅是當前位置的數組元素和後面其他元素進行交換位置。
第0個元素 < …. 每個元素
第1個元素 < …. 每個元素 ……

     舉例:如有abcde個元素進行全排列,首先a <->b進行交換,得到bacde;然後進行遞歸調用,b不動,a <-> c進行交換,得到bcade;bc不動,a <-> d交換,得到bcdae;bcd不動,a <-> e交換,得到bcdea;這樣就形成了層層遞歸。

當前位置的數組元素的位置信息(即第幾個元素)作爲遞歸調用的函數的一個參數,這樣每次的當前交換位置都會變化,構造了相似性,使得遞歸調用不會每次都是完全相同的。

在進行這種遞歸分隔的時候,需要注意:如 a b c d e,在a \ c進行交換後,要把他們的位置重新換回來。若不換回來,會影響其後的計算,破壞遞歸開始的初始局面,結束遞歸的基準就不存在了。因此在結束時要進行回溯(十分重要)。

 【白話說明回溯】比如在a <-> e 交換之後得到bcdea,還會進行兩次遞歸調用, 當for語句循環條件不成立時,則會層層返回,每次返回到上層遞歸時就要進行回溯。比如當再次回到得到bcdea的那一層遞歸時,接下來就要進行回溯,把在這一層交換的位置給換回來,即回到bcdae的狀態,然後再返回到上一層遞歸,就不會影響上一層接下來的回溯執行。

遞歸的出口:
for( int i = k ; i < strlen(data) ; i++)因爲這個循環語句中已經有了 i < strlen(data)爲限制出口的條件。
何時打印:
噹噹前的交換位置已經移到最後一個元素,則應該進行輸出,沒必要在遞歸了。

這裏寫圖片描述
這裏寫圖片描述

3、求兩個串的最大公共子序列的長度?

公共子序列:
如abcdef ,abc abd bdf ….都是abcdef 的子序列,但abcdef不是其本身的子序列。從串中隨便取哪些元素組合成的新的串就是子序列。
用遞歸解決這個問題是可行的,但是效率不高。

     分析:設有兩個字符串 s1和 s2,分別取兩個字符串中的第一個字符 ch1 和 ch2。如果ch1 == ch2,那麼只要求s1和s2中剩下的字符串中最大公共子序列的長度,再+1就是要求的結果。如果ch1 != ch2 , 那麼把s1中除了第一個字符以外的剩下的字符和整個s2進行比較,得到最大公共子序列的長度 len1,再把s2中除了第一個字符以外的剩下的字符和整個s1進行比較(所謂的比較就是分別取出兩個字符串中的第一個字符判斷是否相等,遞歸調用),得到最大公共子序列的長度 len2,取 len1 和 len2 中的最大值。

遞歸出口:若兩個字符串中有一個爲0,則不需要再進行比較了,return 0 ;
這裏寫圖片描述
這裏寫圖片描述

4、求“cba”的反串“abc”。

構建遞歸的要訣:

  • 找到相似性
  • 定義出口
    這裏寫圖片描述

5、在楊輝三角形中,計算第 m 層的第 n 個係數的計算方法。

這裏寫圖片描述

運用這個遞歸,可以很方便的打印出楊輝三角。

這裏寫圖片描述

6、計算m個A,n個B可以組合成多少個不同排列的問題。

  如計算3個A,2個B,可以組成多少種排列的問題(如AAABB,AABBA)。

  經驗總結:
  當要處理一堆東西的時候,往往是把一堆東西中的某一個當成是特殊的,然後把這一堆分成兩個部分進行處理。

這裏寫圖片描述

7、整數n的劃分問題。

  如對整數6進行劃分, 6
                                    5+1
                                    4+2,4+1+1
                                    3+3,3+2+1,3+1+1+1
                                    2+2+2,2+2+1+1,2+1+1+1+1
                                    1+1+1+1+1+1

 分析:確定第一位,然後通過遞歸求後面的位數。
            5  .... f(1)
            4  .... f(2)  ……
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章