📘简单递推

2026-08-20
⭐⭐ GESP 5级

📖概念讲解

递推是动态规划的前置技能,本质就是找规律、推公式:从已知的初始条件出发,一步步推出后面的结果。

和递归不同,递推是从小往大算(正推),不用函数调用自己,不容易爆栈。核心步骤:

⚡ 易错点:递推顺序!如果 f[i] 依赖 f[i-1],必须从 i=2 往后推,不能乱序。DP 里也一样,顺序错了结果就炸。

💻代码示例

经典例题:爬楼梯。每次可以走 1 阶或 2 阶,问到第 n 阶有多少种走法。

1#include <iostream>
2using namespace std;
3
4int main() {
5 int n; cin >> n; // 楼梯总阶数
6 int f[50] = {0}; // f[i] = 到第 i 阶的走法数
7 f[1] = 1; // 第1阶:只有1种(走1步)
8 f[2] = 2; // 第2阶:2种(1+1 或 2)
9 for (int i = 3; i <= n; i++) // 从第3阶开始递推
10 f[i] = f[i-1] + f[i-2]; // 到第i阶 = 从i-1走1步 + 从i-2走2步
11 cout << f[n] << endl;
12 return 0;
13}
14// 输入 5 → 输出 8

💡 这个递推式和斐波那契一模一样:f[n] = f[n-1] + f[n-2]。递推比递归快得多,因为没有重复计算。

🧩互动小测

第 1 题

爬楼梯问题中,f[1]=1, f[2]=2,请问 f[5] 等于多少?

第 2 题

递推和递归的关键区别是什么?

第 3 题

如果爬楼梯每次可以走 1、2、3 阶,递推关系式是?

🏋️动手练一练

📝 编程练习

题目:铺砖问题
有一个 1×n 的长条地板,要用 1×1 和 1×2 的瓷砖铺满。求有多少种铺法。

输入:一个整数 n(1 ≤ n ≤ 40)
输出:铺法总数

提示:考虑最后一块瓷砖:如果放的是 1×1,前面有 f[n-1] 种;如果放的是 1×2(横着放),前面有 f[n-2] 种。
参考答案:
#include <iostream>
using namespace std;

int main() {
    int n;  cin >> n;
    long long f[50] = {0};    // 用 long long 防溢出
    f[1] = 1;                 // 只能放 1×1
    f[2] = 2;                 // 两个1×1 或 一个1×2
    for (int i = 3; i <= n; i++)
        f[i] = f[i-1] + f[i-2];  // 最后放1×1 + 最后放1×2
    cout << f[n] << endl;
    return 0;
}
// 输入 4 → 输出 5

要点:本质还是斐波那契!n≤40 时用 long long,否则 int 会溢出。递推填表是 DP 的基本功。

📝易错点提醒

学完这个知识点后点一下