从递归到递推

8 分钟

同一个问题,常有两种算法方向。递归是“从大问题往小问题问”:要算 ,就先去问 ,一层层往下,直到最小的已知情况(边界)才返回。递推反过来,“从小往大算”:先摆好最小的答案,再用循环一步步推出更大的。

以斐波那契为例,

// 递归:从大往小问,会重复计算,指数级慢
int f(int n) {
    if (n <= 2) return 1;
    return f(n-1) + f(n-2);
}

// 递推:从小往大算,一遍循环,O(n)
int g(int n) {
    int a = 1, b = 1;
    for (int i = 3; i <= n; i++) {
        int c = a + b;   // 由前两个推出当前
        a = b; b = c;
    }
    return b;
}

朴素递归会把 等子问题重复算很多遍,退化成指数级 ;递推每个值只算一次,,还省掉了递归的栈空间。所以能改成递推时,通常更快、更省内存。

小纸条

递推是从大往小算,还是从小往大算?

登录 后可看答案

从递归到递推 · 考级冲刺 · op599 课程