從經典問題學遞歸:3X4的方格 從左上角A走到右下角B 只能向右向下走 一共有多少種走法?

題目:3X4的方格 從左上角A走到右下角B 只能向右向下走 一共有多少種走法?
圖形:題目轉化爲圖形之後就是,從(1, 1)方格走到(3, 4)方格有多少種方案(每次走一格)?
clipboard.png
分析:
1、根據題目我們知道只能往右走或者向下走,那麼從(2, 4)格子走到(3, 4)格子只有一種方案,從(3, 3)格子走到(3, 4)格子也只有一種方案。
2、以此類推,到某個格子A的走法 = A上面的格子走法 + A左邊的格子走法;
3、如果碰到第一行或者第一列的格子,那麼走法只有一種
4、如果碰到第一個格子,我們認爲不需要走,即走法爲0
總結:
1、這種把一個複雜的問題分解成若干個有相同規律的子問題的方法,我們稱之爲遞歸。
2、遞歸由遞歸條件和遞歸出口組成,其中遞歸出口非常重要。
3、分析中的第2點我們稱之爲遞歸條件。
4、分析中的點3、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
問題:
根據上面的分析,我們知道在遞歸的過程中,會有很多重複的格子,非常浪費性能,當計算的數字越大,遞歸的性能也會越低,怎麼提高遞歸的性能呢?下次我們再介紹(剪枝)。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章