題目:3X4的方格 從左上角A走到右下角B 只能向右向下走 一共有多少種走法?
圖形:題目轉化爲圖形以後就是,從(1, 1)方格走到(3, 4)方格有多少種方案(每次走一格)?
分析:
一、根據題目咱們知道只能往右走或者向下走,那麼從(2, 4)格子走到(3, 4)格子只有一種方案,從(3, 3)格子走到(3, 4)格子也只有一種方案。
二、以此類推,到某個格子A的走法 = A上面的格子走法 + A左邊的格子走法;
三、若是碰到第一行或者第一列的格子,那麼走法只有一種
四、若是碰到第一個格子,咱們認爲不須要走,即走法爲0
總結:
一、這種把一個複雜的問題分解成若干個有相同規律的子問題的方法,咱們稱之爲遞歸。
二、遞歸由遞歸條件和遞歸出口組成,其中遞歸出口很是重要。
三、分析中的第2點咱們稱之爲遞歸條件。
四、分析中的點三、4點咱們稱之爲遞歸出口(返回明確的值)。
代碼:
// N X M的方格 從左上角A(1, 1)走到右下角B(N, M) 只能向右向下走 一共有多少種走法?
function calc(x, y){
// 座標(1, 1) 遞歸出口
if(x == 1 && y == 1) return 0;
// 座標(x, 1) (1, y) 遞歸出口
if(x == 1 || y == 1) return 1;
// 遞歸條件
if(x > 1 && y > 1) {
return calc(x-1, y) + calc(x, y-1);
}
// 不符合條件,直接返回0
return 0;
}
calc(3, 4); // 10
問題: 根據上面的分析,咱們知道在遞歸的過程當中,會有不少重複的格子,很是浪費性能,當計算的數字越大,遞歸的性能也會越低,怎麼提升遞歸的性能呢?下次咱們再介紹(剪枝)。