0%
3 min read 学习笔记 学习路线

线性递推入门

从特征方程到生成函数,系统梳理常系数线性递推的求解方法与典型例子。

递推关系是描述数列或算法复杂度的基本语言。一个数列 {an}\{a_n\} 如果满足

an=c1an1+c2an2++ckank+f(n),a_n = c_1 a_{n-1} + c_2 a_{n-2} + \cdots + c_k a_{n-k} + f(n),

就称为 kk 阶常系数线性递推。当 f(n)0f(n) \equiv 0 时称为齐次,否则称为非齐次。本文聚焦如何系统求解这类递推。

Definition

一个 kk 阶常系数线性递推形如

an+c1an1+c2an2++ckank=f(n),a_n + c_1 a_{n-1} + c_2 a_{n-2} + \cdots + c_k a_{n-k} = f(n),

其中 cic_i 为常数,f(n)f(n) 为驱动项。若 f(n)0f(n) \equiv 0,则称为齐次递推。

齐次线性递推:特征方程法

对于齐次递推

an=c1an1+c2an2++ckank,a_n = c_1 a_{n-1} + c_2 a_{n-2} + \cdots + c_k a_{n-k},

假设解具有指数形式 an=rna_n = r^n,代入后得到其特征方程

rkc1rk1c2rk2ck=0.r^k - c_1 r^{k-1} - c_2 r^{k-2} - \cdots - c_k = 0.

特征根互异

若特征方程有 kk 个不同根 r1,r2,,rkr_1, r_2, \dots, r_k,则通解为

an=A1r1n+A2r2n++Akrkn,a_n = A_1 r_1^n + A_2 r_2^n + \cdots + A_k r_k^n,

其中系数 AiA_i 由初始条件确定。

重根情况

rrmm 重根,则它在通解中贡献

(A0+A1n++Am1nm1)rn.(A_0 + A_1 n + \cdots + A_{m-1} n^{m-1}) r^n.

直观上,重根会引入多项式因子来保持解空间的维数。

例子:Fibonacci 数列

Fibonacci 数列满足

Fn=Fn1+Fn2,F0=0, F1=1.F_n = F_{n-1} + F_{n-2}, \quad F_0 = 0,\ F_1 = 1.

特征方程为 r2r1=0r^2 - r - 1 = 0,根为

r1,2=1±52.r_{1,2} = \frac{1 \pm \sqrt{5}}{2}.

因此

Fn=A(1+52)n+B(152)n.F_n = A \left(\frac{1+\sqrt{5}}{2}\right)^n + B \left(\frac{1-\sqrt{5}}{2}\right)^n.

代入 F0=0F_0 = 0F1=1F_1 = 1 可解得 A=1/5A = 1/\sqrt{5}B=1/5B = -1/\sqrt{5},即 Binet 公式

Fn=15[(1+52)n(152)n].F_n = \frac{1}{\sqrt{5}}\left[\left(\frac{1+\sqrt{5}}{2}\right)^n - \left(\frac{1-\sqrt{5}}{2}\right)^n\right].

非齐次线性递推

非齐次递推的通解结构为

an=an(h)+an(p),a_n = a_n^{(h)} + a_n^{(p)},

其中 an(h)a_n^{(h)} 是对应齐次递推的通解,an(p)a_n^{(p)} 是一个特解。

Theorem

非齐次线性递推的任意两个解之差都是对应齐次递推的解。因此通解等于齐次通解加上任意一个特解。

寻找特解时,通常根据 f(n)f(n) 的形式猜测:

f(n)f(n) 的形式特解猜测形式
常数 CC常数 AA(若 1 不是特征根)
nn 的多项式同次多项式
CαnC \cdot \alpha^nAαnA \cdot \alpha^n(若 α\alpha 不是特征根)
CαnC \cdot \alpha^nα\alphamm 重特征根AnmαnA n^m \alpha^n

例子:汉诺塔

汉诺塔移动次数满足

Tn=2Tn1+1,T1=1.T_n = 2T_{n-1} + 1, \quad T_1 = 1.

对应齐次递推 Tn(h)=2Tn1(h)T_n^{(h)} = 2T_{n-1}^{(h)} 的通解为 Tn(h)=A2nT_n^{(h)} = A \cdot 2^n。 由于驱动项是常数 11,且 11 不是特征根 22,设特解为常数 BB。代入得

B=2B+1    B=1.B = 2B + 1 \implies B = -1.

于是 Tn=A2n1T_n = A \cdot 2^n - 1。由 T1=1T_1 = 1A=1A = 1,故

Tn=2n1.T_n = 2^n - 1.

生成函数视角

生成函数是处理递推的另一种强大工具。对数列 {an}\{a_n\} 定义普通生成函数

G(x)=n=0anxn.G(x) = \sum_{n=0}^{\infty} a_n x^n.

将递推关系两边乘以 xnx^n 并求和,可以把递推转化为关于 G(x)G(x) 的代数方程。解出 G(x)G(x) 后再展开即可得到 ana_n 的显式公式。

例子:Fibonacci 的生成函数

Fn=Fn1+Fn2F_n = F_{n-1} + F_{n-2}F0=0,F1=1F_0=0, F_1=1,可得

G(x)=x+xG(x)+x2G(x),G(x) = x + x G(x) + x^2 G(x),

G(x)=x1xx2.G(x) = \frac{x}{1 - x - x^2}.

对分母因式分解并部分分式展开后,同样能得到 Binet 公式。

常见误区与技巧

Warning

在猜测非齐次特解时,如果猜测形式已经是齐次解的一部分,需要乘以 nn 的适当幂次,否则无法得到有效的特解。

  • 初始条件要足够kk 阶递推需要 kk 个连续初始值才能唯一确定解。
  • 复数根的处理:若特征根为复数,通常用欧拉公式化为三角函数形式,这在物理和信号处理中尤为常见。
  • 变系数递推:本文方法仅适用于常系数情形;变系数递推通常需要其他技巧,如生成函数、特殊函数或近似方法。

总结

常系数线性递推的求解可归纳为三步:

  1. 写出特征方程并求根,得到齐次通解。
  2. 根据驱动项形式猜测非齐次特解,必要时乘以 nn 的幂次。
  3. 利用初始条件确定通解中的待定系数。

生成函数则提供了一种统一且机械的视角,尤其适合处理复杂边界条件或组合计数问题。掌握这两种方法,就能应对大多数算法分析和离散数学中的递推问题。

Comments