递推关系是描述数列或算法复杂度的基本语言。一个数列 如果满足
就称为 阶常系数线性递推。当 时称为齐次,否则称为非齐次。本文聚焦如何系统求解这类递推。
Definition
一个 阶常系数线性递推形如
其中 为常数, 为驱动项。若 ,则称为齐次递推。
齐次线性递推:特征方程法
对于齐次递推
假设解具有指数形式 ,代入后得到其特征方程
特征根互异
若特征方程有 个不同根 ,则通解为
其中系数 由初始条件确定。
重根情况
若 是 重根,则它在通解中贡献
直观上,重根会引入多项式因子来保持解空间的维数。
例子:Fibonacci 数列
Fibonacci 数列满足
特征方程为 ,根为
因此
代入 、 可解得 、,即 Binet 公式
非齐次线性递推
非齐次递推的通解结构为
其中 是对应齐次递推的通解, 是一个特解。
Theorem
非齐次线性递推的任意两个解之差都是对应齐次递推的解。因此通解等于齐次通解加上任意一个特解。
寻找特解时,通常根据 的形式猜测:
| 的形式 | 特解猜测形式 |
|---|---|
| 常数 | 常数 (若 1 不是特征根) |
| 的多项式 | 同次多项式 |
| (若 不是特征根) | |
| 且 是 重特征根 |
例子:汉诺塔
汉诺塔移动次数满足
对应齐次递推 的通解为 。 由于驱动项是常数 ,且 不是特征根 ,设特解为常数 。代入得
于是 。由 得 ,故
生成函数视角
生成函数是处理递推的另一种强大工具。对数列 定义普通生成函数
将递推关系两边乘以 并求和,可以把递推转化为关于 的代数方程。解出 后再展开即可得到 的显式公式。
例子:Fibonacci 的生成函数
由 及 ,可得
即
对分母因式分解并部分分式展开后,同样能得到 Binet 公式。
常见误区与技巧
Warning
在猜测非齐次特解时,如果猜测形式已经是齐次解的一部分,需要乘以 的适当幂次,否则无法得到有效的特解。
- 初始条件要足够: 阶递推需要 个连续初始值才能唯一确定解。
- 复数根的处理:若特征根为复数,通常用欧拉公式化为三角函数形式,这在物理和信号处理中尤为常见。
- 变系数递推:本文方法仅适用于常系数情形;变系数递推通常需要其他技巧,如生成函数、特殊函数或近似方法。
总结
常系数线性递推的求解可归纳为三步:
- 写出特征方程并求根,得到齐次通解。
- 根据驱动项形式猜测非齐次特解,必要时乘以 的幂次。
- 利用初始条件确定通解中的待定系数。
生成函数则提供了一种统一且机械的视角,尤其适合处理复杂边界条件或组合计数问题。掌握这两种方法,就能应对大多数算法分析和离散数学中的递推问题。
Comments