从经典问题学递归:3X4的方格 从左上角A走到右下角B 只能向右向下走 一共有多少种走法?

题目:3X4的方格 从左上角A走到右下角B 只能向右向下走 一共有多少种走法?
图形:题目转化为图形以后就是,从(1, 1)方格走到(3, 4)方格有多少种方案(每次走一格)?
clipboard.png
分析:
一、根据题目咱们知道只能往右走或者向下走,那么从(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
问题: 根据上面的分析,咱们知道在递归的过程当中,会有不少重复的格子,很是浪费性能,当计算的数字越大,递归的性能也会越低,怎么提升递归的性能呢?下次咱们再介绍(剪枝)。
相关文章
相关标签/搜索