7.2 线性递推关系
第 7.1 节用递归规则构造字符串和表达式。现在我们把同样的思想用于:按照整数下标排列的一列数。
数列通常写成
a0,a1,a2,a3,… 符号 an 表示“下标为 n 的那一项”。下标是位置标记,并非乘法;例如 a3 表示第 3 号位置的项。
是一条用一个或多个较早项来定义 an 的等式。例如,
an=an−1+3(n≥1) 表示每一项都比前一项大 3。
只有递推式还不够,我们还需要一个,例如
这样,每一项才会被唯一确定:
a1a2a3=a0+3=2+3=5,=a1+3=5+3=8,=a2+3=8+3=11. 所以数列开头是
2,5,8,11,… 如果只把初始值改成 a0=10,同一个递推式就会生成另一条数列。可以把递推式看成机器的运行规则,而初始条件决定机器从哪里启动。
递推关系的是它向前回看的最远距离。
递推式
an=2an−1+1 只使用紧邻的前一项,因此是一阶递推。
递推式
an=an−1+an−2 会向前回看两个位置,因此是二阶递推。它通常需要两个初始值,例如 a0 和 a1。
例如,给定
a0=1,qquada1=1,qquadan=an−1+an−2(n≥2), 可得到
1,1,2,3,5,8,… 计算 n=2 时,a1 和 a0 都已经知道。如果只提供 a0,那么 a1 仍然未知,递推机器便无法启动。
递推关系给出的是局部规则。要计算 a100,可能需要先算出前面所有项。则直接用 n 表示 an,不再引用数列的早期项。
对递推关系
a0=2,qquadan=an−1+3, 反复代入可得
an=an−1+3=(an−2+3)+3=an−2+2⋅3=⋯=a0+n⋅3=2+3n. 省略号表示重复执行同一种代入,直到下标降到 0。我们可以分别检查基础值与递推式来验证公式:
a0=2+3(0)=2, 并且
(2+3n)−[2+3(n−1)]=3. 考虑
b0=5,qquadbn=2bn−1. 逐层展开:
bn=2bn−1=22bn−2=⋯=2nb0=5⋅2n. 这是一个等比数列。更一般地,
b0=c,qquadbn=rbn−1 的通项公式是
这里 r 是固定的倍数。指数 n 记录递推回到基础值之前,一共乘了多少次 r。
启动递推时间机器:配置一阶或二阶依赖,逐项揭示数值,并沿支撑某个选中结果的实际代入链向后检查。若移除必要的种子值,依赖轨道会在第一个未定义项处断开,而不会凭空猜出一个数。
第 6 章通过加法原理统计互斥情况。如果规模为 n 的对象能够分成互斥类别,而每个类别删去最后一步后对应一个更小规模的对象,那么它们的数量就会满足递推关系。
例子:铺满长条板
设 tn 表示用以下瓷砖铺满长度为 n 的长条板的方法数:
- 长度为 1 的方砖;
- 长度为 2 的多米诺骨牌。
瓷砖不能重叠,并且必须恰好覆盖整块长条板。
先给出两个初始计数:
t0=1,qquadt1=1. 为什么 t0=1 而不是 0?空长条恰好有一种铺法:什么砖都不放。这个“空构造”能让递推式在边界处正确工作。
对 n≥2,按照分类所有铺法。
- 如果最后是方砖,移除它以后,会留下任意一个长度为 n−1 的铺法,因此这一类有 tn−1 种。
- 如果最后是多米诺骨牌,移除它以后,会留下任意一个长度为 n−2 的铺法,因此这一类有 tn−2 种。
两类互不相交,因为一种铺法不可能同时以两种砖结尾;两类也覆盖全部铺法,因为每个非空铺法都有最后一块砖。因此加法原理给出
tn=tn−1+tn−2. 现在逐项计算:
t2t3t4t5=t1+t0=1+1=2,=t2+t1=2+1=3,=t3+t2=3+2=5,=t4+t3=5+3=8. 请注意这里的逻辑链条:
按照最后一个构造步骤分类⟶与更小对象建立双射⟶相加各类数量⟶递推关系. 这个递推式不是根据几项数字猜出来的模式,而是结构化计数论证的记录。
如果较早的数列项都只出现一次方,并且彼此不相乘,这个递推关系就是。
例如,
an=5an−1−6an−2 是线性递推。相反,
an=an−1an−2 把两个早期项相乘,因此是非线性的。
如果等式中没有只依赖于 n 的额外项,线性递推就是。所以
an=5an−1−6an−2 是齐次的,而
an=5an−1−6an−2+n 因为多出一个 n,所以是非齐次的。
若早期项前面的系数(例如 5 和 −6)不随 n 改变,就称递推关系具有。
考虑
an=5an−1−6an−2(n≥2). 先寻找形如 an=rn 的等比解。代入递推式:
rn=5rn−1−6rn−2. 当 r=0 时,两边除以 rn−2:
r2=5r−6. 把所有项移到一边:
r2−5r+6=0. 这就是。因式分解得到
(r−2)(r−3)=0, 所以两个不同的根是 r=2 和 r=3。
每个根都给出一个等比解,它们的任意线性组合仍然是解:
an=A2n+B3n. 两个常数 A 和 B 由两个初始条件决定。假设
a0=2,qquada1=5. 令 n=0:
令 n=1:
用第二个方程减去第一个方程的两倍,得到 B=1,进而 A=1。因此
an=2n+3n. 还可以直接验证:
5an−1−6an−2=5(2n−1+3n−1)−6(2n−2+3n−2)=2n+3n. 如果特征方程中的同一个根 r 出现两次,两个独立的构造块是
rn和nrn. 因此通解形式为
an=(A+Bn)rn. 例如,递推关系
an=6an−1−9an−2 的特征方程是
r2−6r+9=(r−3)2=0, 所以解具有形式
an=(A+Bn)3n. 常数 A 和 B 仍然由初始条件确定。
把方砖和多米诺骨牌拖入长条板,再把完整铺法图库折叠成“最后是方砖”和“最后是多米诺骨牌”两族。移除最后一块砖,就能看到它们与规模 n−1、n−2 的可逆对应;递推账本会根据实际构造同步更新。
初始条件负责启动递推,阶数说明需要多少个早期值,而计数递推必须来自互斥且完备的分类,不能只因为前几项数字看起来吻合就下结论。
本节递推关系依赖固定数量的紧邻早期项。递归算法会产生另一种重要结构:一个规模为 n 的问题被拆成若干规模为 n/b 的子问题。第 7.3 节将把这种执行过程写成分治递推,并用递归树进行分析。