随着学习的深入,发现递推关系在数学和算法领域都有着及其重要的作用。并且其还有一个特点就是相对生成函数,排列组合等内容来说,递推关系貌似更加“零碎”,很多人反应说觉得递推关系“方法多,巧,难想到”。本文就在这里梳理下递推关系相关的内容,使读者对其有一个系统性的理解和掌握。
递推关系的定义
百度百科:如果数列f的第n项与它前一项或几项的关系可以用一个式子来表示,那么这个公式叫做这个数列的递推公式
我们用更加数学的语言来说明那就是
a
n
=
f
(
a
n
−
1
,
a
n
−
2
,
.
.
.
,
a
1
)
a_n=f(a_{n-1},a_{n-2},...,a_1)
an=f(an−1,an−2,...,a1)
哲学上来说,是整体与部分的关系,从部分推知整体。我们发现事物与其“相邻事物”的联系
=
>
=>
=>事物总体特征
由此可见,递推关系并不是一个相对独立的系统,它是处理其他问题的一种方法。那么如何递推求通项公式,就是问题的递推关系的核心问题。
常见的递推关系及解法
接下来介绍常见的递推关系及其解法,实际上就是下面俩个问题。
特征方程法
问题1.解常系数线性齐次递推关系
一般形式: f ( n ) = c 1 ∗ f ( n − 1 ) + c 2 ∗ f ( n − 2 ) + c k ∗ f ( n − k ) f(n)=c_1*f(n-1)+c_2*f(n-2)+c_k*f(n-k) f(n)=c1∗f(n−1)+c2∗f(n−2)+ck∗f(n−k)
定义特征方程:
x
k
−
c
1
∗
x
k
−
1
−
c
2
∗
x
k
−
2
−
.
.
.
−
c
k
=
0
x^k-c_1*x^{k-1}-c_2*x^{k-2}-...-c_k=0
xk−c1∗xk−1−c2∗xk−2−...−ck=0
解:如果这个方程有k个不同的根,分别记作
q
1
,
q
2
,
.
.
.
,
q
k
q_1,q_2,...,q_k
q1,q2,...,qk,则
f
(
n
)
=
b
1
∗
q
1
n
+
b
2
∗
q
2
n
+
.
.
.
+
b
k
∗
q
k
n
f(n)=b_1*q_1^n+b_2*q_2^n+...+b_k*q_k^n
f(n)=b1∗q1n+b2∗q2n+...+bk∗qkn,其中
b
1
,
b
2
.
.
.
,
b
k
b_1,b_2...,b_k
b1,b2...,bk都是待定常系数
如果有
m
m
m重根
q
q
q,则
q
n
,
n
∗
q
n
,
.
.
.
,
n
m
−
1
∗
q
n
q^n,n*q^n,...,n^{m-1}*q^n
qn,n∗qn,...,nm−1∗qn都是原递推关系的解
问题2.解常系数线性非齐次递推关系
一般形式:
f
(
n
)
=
c
1
∗
f
(
n
−
1
)
+
c
2
∗
f
(
n
−
2
)
+
c
k
∗
f
(
n
−
k
)
+
g
(
n
)
f(n)=c_1*f(n-1)+c_2*f(n-2)+c_k*f(n-k)+g(n)
f(n)=c1∗f(n−1)+c2∗f(n−2)+ck∗f(n−k)+g(n)
有如下结论:非齐次解=对应齐次解+特解
齐次解如何解,
g
(
n
)
=
0
g(n)=0
g(n)=0,化归为问题
1
1
1
关于特解,我们针对
g
(
n
)
g(n)
g(n)的常见形式有如下公式
只需要设出
g
(
n
)
g(n)
g(n),代入递推关系求出
g
(
n
)
g(n)
g(n),然后和齐次解相加得到非齐次解,再用初始值确定待定参数即可。
生成函数法
生成函数能解决的问题之一就是递推关系,但实际上生成函数来做递推关系是大炮打蚊子,也就是说方法会非常简单,但是计算比较复杂。具体方法就三步:
1.令
A
(
x
)
=
∑
n
=
0
∞
f
(
n
)
x
n
A(x)=\sum_{n=0}^∞f(n)x^n
A(x)=∑n=0∞f(n)xn
2.将关于
f
(
n
)
f(n)
f(n)的递推关系转化为关于
A
(
x
)
A(x)
A(x)的方程式
3.解出
A
(
x
)
A(x)
A(x),将
A
(
x
)
A(x)
A(x)展开成
x
x
x的幂级数,
x
n
x^n
xn的系数就是
f
(
n
)
f(n)
f(n)
例题
递推关系在算法中的应用
常见到几乎无处不在。但是最重要的应用是动态规划。动态规划就是递推,动态规划问题的思考方式是一种对问题规模的整体思考。具体可以参考我的数据结构与算法专栏中的动态规划解法。