递推算法是信息学奥赛(OI)中一种基础且重要的算法思想。它通过已知的初始条件,利用特定的递推关系,逐步推导出后续的数据或结果。递推算法的核心在于找到问题中数据之间的内在联系,将一个复杂的问题分解为一系列简单的步骤,通过不断重复这些步骤来得到最终的解。其功能在于能够高效地解决一些具有规律性和重复性的问题,避免了重复计算,提高了算法的效率。
递推算法适用场景有:
- 数列问题:当数列中的每一项都可以由前面的若干项通过某种固定的规则计算得出时,递推算法可以轻松解决。例如斐波那契数列,每一项都是前两项之和。
- 计数问题:在一些需要统计方案数、排列组合数等的问题中,递推算法可以通过分析问题的特点,找出递推关系,从而计算出结果。比如走楼梯问题,计算到达第
级楼梯的不同走法数量。 - 动态规划基础:递推是动态规划的基础,许多动态规划问题可以通过递推的方式来解决。在处理具有最优子结构和重叠子问题的问题时,递推算法可以为动态规划提供思路。
递推算法的关键在于找到合适的递推关系和初始条件。递推关系是指数据之间的数学联系,它决定了如何从已知的项推导出未知的项;初始条件则是递推的起点,没有正确的初始条件,递推过程将无法开始。
递推有两种思考方向:
- 顺推:从已知的初始条件出发,按照一定的递推规则,逐步计算出后续的结果。
- 逆推:从问题的目标状态出发,通过逆向的递推关系,逐步推导出初始状态。
斐波那契类
1 1 2 3 5 8 13 ...当前项是前两项元素之和,我们可以使用数组存储中间结果,则
同时,为了节省空间,我们可以迭代的来求解:
a = 1;
b = 1;
for (int i = 3; i <= n; i++) {
t = a + b;
a = b;
b = t;
}
cout << b << endl;经典例题:洛谷 P1255. 数楼梯
问题分析:当
经典例题:兔子繁殖问题
雌雄兔子各一只放入养殖场中,每只雌兔在出生两个月后每月产雌雄兔子个一只。第
问题分析:当
汉诺塔类
经典例题:求汉诺塔问题中盘子从 A 柱移动到 C 柱最少移动了多少次?
- 状态定义:设
表示移动 个盘子所需要的最少移动次数。 - 递推关系:
- 移动
个盘子时,需先将前 个盘子从 柱移动到 柱( 次) - 再将第
个盘子从 柱移动到 柱( 次) - 最后将
柱上的 个盘子从 柱移动到 柱( 次) - 因此:
- 移动
- 初始条件:
- 递推方向:从
到 顺推计算出 - 数学本质: 等比数列,通项公式为
经典例题:Jouier 2410. Strange Towers of Hanoi
问题分析:设
平面分割类
经典例题:设有

问题分析:当平面上已经有
例题 2:
- 状态定义: 设
表示 条直线最多将平面分割成的区域个数。 - 递推关系:
- 第
条直线与前 条直线最多有 个交点,这些交点将第 条直线分成 段。 - 每段对应一个新增区域,因此新增区域数为
。 - 因此:
- 第
- 初始条件:
(没有直线时,只有一个区域) - 递推方向:从
到 顺推计算出 。 - 数学本质:通过求和可得:
。
双递推类
经典例题:位数问题
在所有的
问题分析:设
- 边界条件:
矩阵递推
经典例题:YBT 1258:数字金字塔
问题分析:设
边界:
目标解:
错排问题
经典例题:
- 状态定义:设
表示 个元素排成一列的错位排列数。 - 递推关系:
- 考虑第
个元素放在第 个位置上( ),分两种情况: - 第
个元素放在第 个位置上,此时剩下 个元素需要错位排列,有 种情况。 - 第
个元素不放在第 个位置上,此时等价于将前 个元素错位排列(第 个元素不放在第 个位置上,相当于新的错位问题),有 种情况。
- 第
- 因此:
- 考虑第
- 初始条件:
(无法错位), (交换两个元素) - 递推方向: 从
到 顺推计算出 。
以上递推方式为顺推,如何进行逆推呢?请同学们思考!
