具体数学笔记(第一章 递归问题)
其实只是把书抄了一遍罢了
1.1 汉诺塔(河内塔)
很简单,就是
T
0
=
0
T
n
=
2
T
n
−
1
+
1
T_0=0 \\ T_n=2T_{n-1}+1
T0=0Tn=2Tn−1+1
这一组等式称为递归式
但是当n很大的时候,计算量会非常大,所以我们需要得出递归式的解,那样我们就会很爽
怎样来求解一个递推式呢?
首先我们可以猜,打表发现
T
n
=
2
n
−
1
T_n=2^n-1
Tn=2n−1
或者用数学归纳法
再或者我们可以改变一下式子,令原式两边同时+1
T
0
+
1
=
1
T
n
+
1
=
2
T
n
−
1
+
2
T_0+1=1 \\ T_n+1=2T_{n-1}+2
T0+1=1Tn+1=2Tn−1+2
令
U
n
=
T
n
+
1
U_n=T_n+1
Un=Tn+1可以轻易得到
U
0
=
1
,
U
n
=
2
U
n
−
1
U_0=1,U_n=2U_{n-1}
U0=1,Un=2Un−1进而得到
T
T
T
1.2 平面上的直线
L 0 = 1 L n = L n − 1 + n L_0=1 \\ L_n=L_{n-1}+n L0=1Ln=Ln−1+n
显然
L
n
=
n
(
n
+
1
)
2
+
1
L_n=\frac{n(n+1)}{2}+1
Ln=2n(n+1)+1
这个称为原递推式的封闭形式:不用它本身来定义
我们再来谈谈平面上直线问题的一个变形:用折线代替直线,平面上由n条这样的折线所界定的区域最大个数
Z
n
Z_n
Zn是多少?
先从小的情况分析,意识到,除了虚线那两条不能与其他区域相交外,一条折线与两条直线是类似的。区域2,3,4对于两条直线来讲是不同的区域,但是对于一条折线来讲是一个区域,也就是说失去了两个区域,也就是说如果我们把一条折线的转折点放在其他所有直线的交点“之外”我们只会仅仅损失两个区域,所以可以得到
Z
n
=
L
2
n
−
2
n
=
n
(
2
n
+
1
)
+
1
−
2
n
=
2
n
2
−
n
+
1
Z_n=L_{2n}-2n=n(2n+1)+1-2n=2n^2-n+1
Zn=L2n−2n=n(2n+1)+1−2n=2n2−n+1
对于n很大的时候可以发现
L
n
∼
1
2
n
2
Z
n
∼
2
n
2
L_n \sim \frac{1}{2}n^2 \\ Z_n \sim2n^2
Ln∼21n2Zn∼2n2
所以大概是4倍
1.3 约瑟夫问题
n个人围成一个圆圈,每隔一个人杀掉一个人,只有一个人存活下来,问最后存活下来那个人的编号
J
(
n
)
J(n)
J(n)
假设n=10, 毙掉的顺序是:2,4,6,8,10,3,7,1,9
那么
J
(
10
)
=
5
J(10)=5
J(10)=5
首先我们考虑有2n个人,发现第一轮过后,除了每个人的编号2-1外,和n个人一开始的情况一样,也就是说
J
(
2
n
)
=
2
J
(
n
)
−
1
J(2n)=2J(n)-1
J(2n)=2J(n)−1
对于2n+1个人,可以显然第一轮过后剩下的是:3,5,7,9,…,2n-1,2n+1
于是乎又得到了与n个人一开始一样的情形,不过这一次他们的编号2+1,进而得到
J
(
2
n
+
1
)
=
2
J
(
n
)
+
1
J(2n+1)=2J(n)+1
J(2n+1)=2J(n)+1
综合上面的柿子就可以得到J的递归式了,并且这个递归式的就按很快,是log级的
打个表
J
(
n
)
=
1
,
∣
1
,
3
,
∣
1
,
3
,
5
,
7
,
∣
1
,
3
,
5
,
7
,
9
,
11
,
13
,
15
,
∣
1
J(n)=1,|1,3,|1,3,5,7,|1,3,5,7,9,11,13,15,|1
J(n)=1,∣1,3,∣1,3,5,7,∣1,3,5,7,9,11,13,15,∣1
可以发现似乎与2的次幂有关,于是我们把
n
n
n写成
2
m
+
l
2^m+l
2m+l的形式
不难发现
J
(
2
m
+
l
)
=
2
l
+
1
(
l
<
=
2
m
)
J(2^m+l)=2l+1(l<=2^m)
J(2m+l)=2l+1(l<=2m)
按照l的奇偶性可以轻易归纳证明
考虑推广:
既然和2的次幂有关,我们不妨把n写成二进制的形式,
n
=
(
b
m
b
m
−
1
.
.
.
b
1
b
0
)
2
n=(b_mb_{m-1}...b_1b_0)_2
n=(bmbm−1...b1b0)2
然后再根据上面得到的柿子可以变为
J
(
n
)
=
(
b
m
−
1
b
m
−
2
.
.
.
b
1
b
0
b
m
)
2
J(n)=(b_{m-1}b_{m-2}...b_1b_0b_m)_2
J(n)=(bm−1bm−2...b1b0bm)2
也就是说n在二进制下向左循环移动一位得到J(n)
如果我们一直用二进制来运算,肯定可以一眼看出来
考虑进一步的推广:
f
(
1
)
=
a
f
(
2
n
)
=
2
f
(
n
)
+
b
f
(
2
n
+
1
)
=
2
f
(
n
)
+
c
f(1)=a \\ f(2n)=2f(n)+b \\ f(2n+1)=2f(n)+c
f(1)=af(2n)=2f(n)+bf(2n+1)=2f(n)+c
尝试把它写成封闭形式
f
(
n
)
=
A
(
n
)
a
+
B
(
n
)
b
+
C
(
n
)
c
f(n)=A(n)a+B(n)b+C(n)c
f(n)=A(n)a+B(n)b+C(n)c
打表可以发现有
A
(
n
)
=
2
m
,
B
(
n
)
=
2
m
−
1
−
l
,
C
(
n
)
=
l
A(n)=2^m, B(n)=2^m-1-l,C(n)=l
A(n)=2m,B(n)=2m−1−l,C(n)=l
同样的用归纳法不难证明
也可以通过取特殊值的方式来证明(a,b,c取特殊值,然后解方程解出关系)