具体数学笔记(第一章 递归问题)

其实只是把书抄了一遍罢了


1.1 汉诺塔(河内塔)

很简单,就是
T 0 = 0 T n = 2 T n − 1 + 1 T_0=0 \\ T_n=2T_{n-1}+1 T0=0Tn=2Tn1+1
这一组等式称为递归式
但是当n很大的时候,计算量会非常大,所以我们需要得出递归式的解,那样我们就会很爽
怎样来求解一个递推式呢?
首先我们可以猜,打表发现 T n = 2 n − 1 T_n=2^n-1 Tn=2n1
或者用数学归纳法
再或者我们可以改变一下式子,令原式两边同时+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=2Tn1+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=2Un1进而得到 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=Ln1+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=L2n2n=n(2n+1)+12n=2n2n+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 Ln21n2Zn2n2
所以大概是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=(bmbm1...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)=(bm1bm2...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)=2m1l,C(n)=l
同样的用归纳法不难证明

也可以通过取特殊值的方式来证明(a,b,c取特殊值,然后解方程解出关系)

posted @ 2021-08-14 14:38  lahlah  阅读(68)  评论(0编辑  收藏  举报