汉诺塔—递归方程求解(续) - GAIT

Download Report

Transcript 汉诺塔—递归方程求解(续) - GAIT

Slide 1

北京航空航天大学计算机学院

具体数学
Concrete Mathematics
赵启阳
2015年11月1日星期日


Slide 2

第一章 递归问题
Recurrence
通过3个例子来认识递归问题:

1 - Hanoi Tower

2 - Lines in the Plane
3 - Josephus Circle
3个例子的3个共同点:


一直被数学家们反复研究;



已知解法都使用递归,大问题化为小问题;



都可以用计算机程序来求解。

2015/11/1

2


Slide 3

1.1 汉诺塔

Hanoi Tower

2015/11/1

3


Slide 4

1.1 汉诺塔
首先来看被称为“汉诺塔”(Hanoi Tower)的智力问题。
该问题是法国数学家Edouard Lucas在1883年提出的。给定
一个由八个大小不同的圆盘组成的塔,最初圆盘按尺寸递
减的次序自底而上地堆放到三根杆中的一根上。类似的问
题是婆罗门塔(64个盘子,一直挪到世界末日……,后面我
们有相关的分析)

2015/11/1

4


Slide 5

汉诺塔—目标和要求
• 目标:把整个塔从一根杆移到另一根杆上。

• 规则:
(1)One time, one disk;
(2)No larger disks on smaller ones, Anytime.
• 直观上很难看出这个问题的解法,但是我们以前在
C语言的递归部分已经遇到过,可以确信它有一个
解。下面看一下一个C语言的Hanoi Tower程序:

2015/11/1

5


Slide 6

汉诺塔—C程序
#include
int hanoiSolver(int peg1, int peg2, int peg3, int dCount)
{
int mCount = 0;
if (dCount > 1) {

Is your solution
the best ?

mCount += hanoiSolver(peg1, peg3, peg2, dCount - 1);

printf("Move the top disk : peg %d -> peg %d\n", peg1, peg3);
mCount += hanoiSolver(peg2, peg1, peg3, dCount - 1);
} else {

printf("Move the top disk : peg %d -> peg %d\n", peg1, peg3);
}
return ++mCount;
}

2015/11/1

int main()
{
int mCount = 0, dCount = 64;
mCount = hanoiSolver(1, 2, 3, dCount);
printf(“Move count is %d\n", mCount);
return 0;
}

6


Slide 7

汉诺塔—新的问题
• 现在的问题:怎样做才最好?也就是说,为了完
成这个任务,多少次移动是必要(necessary)而且充
分(sufficient)的?
• 婆罗门塔有64个圆盘,而汉诺塔有8个圆盘。单纯
考虑这两个特定数字的特定例子反而难以下手,不
如先从小一点的例子出发,再进而考虑一般化的例
子,最后再推广到这两个特定问题。下面考虑任意
n 个圆盘的情况。

2015/11/1

7


Slide 8

汉诺塔—小规模情况
• 很容易看出如何转移一个仅包含一个或者两个圆盘
的塔,而且用少量实验就能说明如何转移包含三个
圆盘的塔。
• 设Tn 为在 Lucas规则下将 n 个盘子从一根杆转移到
另一根杆的最少移动次数(注意是最少!!!)
• 很明显, T0 = 0,T1 = 1,T2 = 3。
• 下面我们来看n = 3的例子,请一位同学来解答。

• 通过对n = 3的总结,我们可以得到什么经验?
2015/11/1

8


Slide 9

汉诺塔— n个盘子情形
• 回忆一下,前面的C程序中转移n个盘子的一般思路:
1、先把 n - 1个小盘子移到中间的杆上(需要Tn-1次移动)
2、然后移动最大的盘(要求1次移动)

3、最后再把n - 1个盘移到最大的盘上(需要Tn-1次移动)

• 结论:
最多移动 2Tn-1+1 次就能转移 n 个盘(其中n > 0),因此

Tn ≤ 2Tn-1 + 1 (n > 0)

• 讨论:
目前还不能断言“=”,因为上面的方案仅能证明2Tn-1+1次移
动可以完成任务,但是无法说明 2Tn-1+1次移动是必须的。
2015/11/1

9


Slide 10

汉诺塔— n个盘子情形(续)
• 转移n个盘子的一般思路(续):
– 你能想到更好的方法吗?找个同学试试看(如果移动次
数相同,但是移动顺序不同也可以)。
– 好吧,我们来想想看:必须在某个时刻移动最大的盘,
当移动最大盘时,n - 1 个最小的盘一定在一根杆上,而
且至少用了Tn-1次移动来把这些盘子放到那根杆上。
– 移动最大盘的次数可能会大于1次。但是:在最后一次
移动最大盘之后,我们必须把n - 1个小盘子(一定还在一
根杆上)转移回最大盘上,这同样需要 Tn-1 次移动。

• 结论:
Tn ≥ 2Tn-1 + 1 (n > 0)
2015/11/1

10


Slide 11

汉诺塔—递归方程
• 将前面两个不等式和 n = 0 的平凡情况结合在一起,可得:
T0 = 0
Tn = 2Tn-1+1
• 上面的两个等式称为递归方程。
• 在递归方程中,需要给出一个边界值(boundary value),以
及根据前面的值来表示一般值的方程。

• 严格来说,递归方程需要有边界值才算是完整的,有时也
把单独一个方程称为一个递归方程。

2015/11/1

11


Slide 12

汉诺塔—递归方程求解
• 有了递归方程,我们可以计算任何 n 值下的Tn。
• 麻烦的是:当n较大的时候,使用递归方程的计算时间太长
n

consumed time on my Notebook (2.66GHz, Core Duo 2)

8

<= 1 second

64

≈ 3 * 236 seconds
≈ 2000000 days
≈ 5479 years

• 递归方程给出的是临近的Tn之间的数值关系(求Tn需要前面的值)
• 我们需要Tn的简洁的“封闭形式”解!!!(closed form,仅仅
与已知量有关,如n),则可以迅速地完成计算。
2015/11/1

12


Slide 13

汉诺塔—递归方程求解

How to Solve it?

GuessProve
• 先在小的数值例子上猜测解的形式,然后
在一般数值上证明其正确性。
• This method would be widely adopted in CM.


Slide 14

汉诺塔—递归方程求解(续)
• 首先,我们在小的例子上计算:








T0 = 0 = 1 – 1
T1 = 1 = 2 – 1
T2 = 3 = 4 – 1
T3 = 7 = 8 – 1
T4 = 15 = 16 – 1
T5 = 31 = 32 – 1
T6 = 63 = 64 – 1

1
2
4
8
16
32
64

20
21
22
23
24
25
26

• OK,似乎我们已经知道解应该是什么样的了:

猜测:Tn = 2n - 1
• 至少这个公式对于n =0, 1, 2, 3, 4, 5, 6都是成立的。
2015/11/1

14


Slide 15

汉诺塔—递归方程求解(续)
数学归纳法——Mathematical Induction
1、归纳基础——Basis
2、归纳推理——induction
• 数学归纳法,是用来证明某个命题对于所有大于等于n0
的整数n都成立的一般方法:

• 首先,证明n为最小值n0时命题成立——归纳基础
• 然后,假设对于包含在n0 和n–1之间的所有值均成立,
在此假设上证明命题对于n成立——归纳推理
• 数学归纳法可以用有限的步骤证明无限多个值上的结论。
前提是用于良序集合。(多说一句,数学归纳法在数学
家之中存在争议,有些坚决不承认无限步骤的证明)
2015/11/1

15


Slide 16

汉诺塔—递归方程求解(续)
• 递归方程是数学归纳法的理想应用。
• 第一步(归纳基础):T0 = 20 – 1, 所以归纳基础成立。
• 第二步(归纳演绎):在Hanoi Tower问题的情况中,我们
很容易从式Tn-1得到Tn:假设n – 1的时候结论成立,那么在
n的时候,我们有
Tn = 2Tn-1 + 1 = 2(2n-1 - 1) + 1 = 2n – 1
因此对于n,我们猜想的结论同样成立。
• OK!到此我们成功地证明了对所有的n > 0

Tn = 2n – 1
2015/11/1

16


Slide 17

汉诺塔—递归方程求解(续)
• 在各种递归问题中,汉诺塔递归问题具有代表性。
有数学方法,有计算机程序……
• 在寻找Tn封闭形式解的过程中,我们经历了三个阶段:
1. 观察数目小的情况。这样能让我们深入了解问题,
并在第二和第三阶段帮助我们。
2.寻找并证明重要变量的数学表达式。对于Hanoi
Tower问题,这个表达式是一个递归方程。我们可以
递归地计算任何n的Tn值。
3.寻找并证明目标函数的封闭形式解。对于Hanoi
Tower 问题,就是递归方程的解。

2015/11/1

17


Slide 18

汉诺塔—递归方程求解(续)
• 这么容易?似乎忘记了重要的一环……
等等……
• First,计算了一些小例子……这个很容易
• Second,用这个出身可疑的数学归纳法
证明最终结论……这个也很容易
• But,既然这么容易,我们上CM干什么?
• Hold on……aha, gotcha……我们怎么这么
顺利地猜到封闭形式解的形式?


Slide 19

汉诺塔—递归方程求解(续)
• 的确,对Hanoi Tower问题的解决过程要求“归纳跳跃”,
严重依赖于能否敏锐地洞悉答案,或者……侥幸地猜中答案
• 这里的逻辑断层就是CM课程的主要任务:锻炼我们对答案
的敏锐洞察力,或者……提升你的幸运指数……

• 对Hanoi Tower问题,我们将会很习惯地在Tn的方程两端都
加1,并且看看它能发生什么
T0 + 1 = 0 + 1 = 1
Tn + 1 = 2Tn-1 + 2 = 2(Tn-1 + 1)
令Un-1 = Tn-1 + 1,我们看到
U0 = 1
Un = 2Un-1

好了,剩下的事情似乎与洞察力无关了……
2015/11/1

19


Slide 20

2nd Homework
• 练习题(不必上交)
1.10、1.11、1.13、1.18
• 作业(可见课程网站,请用英文解答)
Suppose we have M pegs (p1, p2, …, pM) and all N disks are on p1. We
need to move them to pM under the Lucas rule. How many moves are
required at least? You may finish it in 3 ways:
(1) Propose some general equalities/inequalities, such as in Exercise
17 and Exercise 25, or
(2) Calculate the exact number for (N, M) = (13, 5), (13, 7), (19, 5), (19,
7), (23, 5) and (23, 7) with your computers. Please submit your numbers
with source codes (in C/C++) together.
(3) Now we know the minimum amount of necessary moves to finish
a Hanoi task of (n, 3) is Tn. But what’s the sub-minimum amount T’n? To say,
T’n is smaller than any other necessary amounts but Tn. How about T’n = Tn
+ 1? Can you find a move scheme for it?
Remember, I’d like invite n guys to show their solutions to us next
time.
• Deadline: before 23:59, 22th, Sep.
2015/11/1

20


Slide 21

1.2 平面中的直线

Lines in the Plane

2015/11/1

21


Slide 22

1.2 平面中的直线
• 问题:平面中的n条直线最多能围出多少个区域(无论开区
域还是闭区域都算)?
• 瑞士数学家Jacob Steiner在1826年首先予以解决(图论、算
法中的Steiner树以其名字命名,该问题是NPC的)
• 先来观察小的情况(我们的老套路):
(1) n = 0 : Ln = 1
(2) n = 1 : Ln = 2
(3) n = 2 : Ln = 4

• 好,先观察到这里。我们猜Ln = 2n,也就是说,每添加1条
直线区域数加倍(剖分原来的所有区域)。
2015/11/1

22


Slide 23

平面中的直线-目标和求解
• 看看猜得准不准
• First,如果1条直线将至多将某区域剖分为2个,则该
区域是凸的,反之也成立(严格的概念和证明请看拓
扑论)
• Second,凸区域被剖分之后也是凸的
• Third,我们的猜测意味着新直线将与所有原区域相交
• Hold on…添加第3条直线,以剖分原来4个区域…what?
无论如何,我们最多只能同时剖分3个!!!

2015/11/1

23


Slide 24

平面中的直线-目标和求解
• 冷静一下……仔细想想……
• 直觉上来看,直线对区域的剖分,表现为在区域中加上了1
条分界线,也正是区域边界与直线相交形成的一段

• 如果将直线划分成不同的段(闭区段和开区段都算),则
每个段剖分1个区域,每剖分1个区域,新增加1个区域。
• 因此,新增加的区域数应该等于新直线被划分的段数!!!
• OK,我们的目标转移了:

新直线能够最多被划分成多少个段?

2015/11/1

24


Slide 25

平面中的直线-目标和求解
• 新直线是被原直线划分成各个段的,因此,
• 目标进一步转移:新直线最多能被原直线划分成多
少个段?
• 每条直线至多相交一次,因此新直线最多与原来的
n - 1直线相交n – 1次,形成n个段(注意两端开放
的段)
• 倒着反推再反推,新直线最多剖分出来n个新的区
域!!!
• So, we get

Ln ≤ Ln-1 + n
2015/11/1

25


Slide 26

平面中的直线-目标和求解
• 事实上,只要使第n条直线不与任何1条原来的
直线相平行,就可以做到和每条直线相交,而
且不经过原来的交点(确保它会被切割成n段,
可用数学归纳法证明)
• 这样,前面的不等式变成等式。对应的递归方
程为

L0 = 1
Ln = Ln-1 + n
• 验证:对小例子L1 = 2 、L2 = 4和L3 = 7都符合这
个递归方程。(可惜还不是封闭形式)
2015/11/1

26


Slide 27

平面中的直线-递归方程求解
• 为了取得封闭形式解,看一下Ln的序列,能猜出什么?
1,2,4,7,11,16,…
• 很难发现规律。变一下策略,索性把递归式完全“展开/摊
开”,看看能发现什么:
Ln = Ln-1 + n
= Ln-2 + (n - 1) + n
= Ln-3 + (n - 2) + (n - 1) + n
……
=L0 + 1 + 2 + …… + (n - 2) + (n – 1) + n
= 1 + Sn (Sn表示前n个正整数之和)
• 也就是说, Ln等于前n个正整数的和 Sn加上1。
2015/11/1

27


Slide 28

平面中的直线-递归方程求解
• 在CM课程中,Sn会经常会出现,我们把它的小值做成表。
下一次再遇到它们的时候,希望能够一眼就瞧出来:

• 这些值被称为三角形数(Triangular Numbers,杨辉三角比
这个更复杂),因为Sn是n行三角形阵中圆孔的个数。譬如
普通的四行阵就有S4 = 10个圆孔。

2015/11/1

28


Slide 29

平面中的直线-递归方程求解
• Gauss在他9岁的时候(1786年,乾隆五十一年)提出了
计算Sn的方法(推荐大家去看看CM第6页上的边注,关于
Gauss为何有这么多的成果):

• 计算过程很简单,我们直接给出结论:

Sn = n (n + 1) / 2

2015/11/1

29


Slide 30

平面中的直线-递归方程求解
• 这样就得到了结果:

Ln = n (n + 1) / 2 + 1
• 上面的结论是部分地凭借直觉得到的,我们可以用数学归
纳法给出一个严格的证明。其中的归纳演绎步骤是

Ln= Ln-1 + n
= [(n - 1) n / 2 + 1] + n
= n (n + 1) / 2 + 1
• OK, now we’re completely sure about the above closed-form.
• But, 到底什么是封闭形式解(closed form)?哪些又不是封
闭形式解?
2015/11/1

30


Slide 31

平面中的直线—封闭形式
• 对一个量f (n)的表达式而言,如果能够最多用固定次数
(此次数独立于n )的“常用”标准运算来算出结果,则
称其为封闭形式的。So,
1、递归方程不是封闭形式,因为求解次数依赖于n。
2、我们得到的Tn和Ln的结果是封闭形式的:
Tn :1次exp,1次—
Ln :2次+,1次× ,1次÷
3、1 + 2 + … + n之类的和不是封闭的(用…省略了中间的加法
计算,其次数与n有关)
4、n(n+1)/2等表达式是封闭的( 1次+,1次×,1次÷)
5、n!是不是呢?
2015/11/1

31


Slide 32

平面中的直线—封闭形式
• 关于n!等封闭形式的例外情形:
• 简单闭形式的总数是有限的,而一些常用、
重要的递归方程并没有简单闭形式

• 为了更好地表达数学运算结果,我们就增
加了一些“常用”的标准运算,以扩展封
闭形式的范围。例如阶乘n! (尽管它的等
价形式1·2·…·n并不是封闭的),也就是说
计算阶乘被视为1次运算。


Slide 33

平面中的直线—变形
• 下面考虑Lines in Plane问题的变形:假设用弯曲线代替直线,
而且每条弯曲线都含有一个“锐角的锯齿形转角(角度不
必相等,可以变化)”,那么平面中n条弯曲线围成的区域
最多有多少呢?
• 先来观察一下n = 1和n = 2的情形:

2015/11/1

33


Slide 34

平面中的直线—变形
• 容易看出:每加入1条弯曲线,就像加入了2条直线,只是
这“两条”直线在交点处没有延伸,因此导致了区域2、3、
4的合并(3变1):

• 每加入1条新弯曲线,在新增加区域的数量中都要至少减去
2。同时,如果把拐点地放到一个开区域,使得隐去的直线
不会与原来的直线相交,我们只会减少2个区域(严格的摆
放方法见Exercise 18)
2015/11/1

34


Slide 35

平面中的直线—变形
• 也就是说,新弯曲线增加的区域数为2n – 2 (先像
2条直线一样考虑区域的剖分,得到2n,再考虑区
域的合并,得到-2)

Zn = Zn-1 + 2n - 2
• 或者,先统一地像2n条直线一样考虑区域的剖分,得到
L2n;再考虑区域的合并,得到-2n,所以

Zn = L2n – 2n
= 2n(2n + 1) / 2 + 1 – 2n
= 2n2 – n + 1
2015/11/1

35


Slide 36

平面中的直线-变形
• 对Ln和Zn的封闭形式进行比较,我们发现对于大的n,有下
面的关系,
Ln ~

1

2

n ,

2
2

Z n ~ 2n ;

• 因此,弯曲线情况得到的区域数目大概是直线情况的4倍。
(CM的第9章会讨论如何分析整函数的近似状态,符号
‘~’的定义可见9.1节)
• 扩展问题:在前面的分析中,我们一直默认为锐角的弯曲
线,而且角度可以变化。那么,如果角度是固定的(可以
是锐角,也可以是钝角),那么结论是怎样的呢?
2015/11/1

36


Slide 37

More on Lines in the Plane
• 在前面讲到的弯曲线问题中,Zig角的大小是不定的,
否则其结论不成立。
• 首先明确边的次序。按顺时针方向,称依次经过的两
条边为左直边和右直边。讨论锐角情形,记角度为d。。
以当前曲线的Zig角点为原点,假设左直边位置为0,右
直边为– d。如何放置另一曲线,才能交出4个交点?

极限位置1 (p = d)
2015/11/1

37


Slide 38

More on Lines in the Plane

极限位置2 (p = -d)
• 记弯曲线2的两条边位置分别为p和(p – d),则仅在
极限位置1和极限位置2之外的弯曲线有可能(并
不是充分条件)交出4个交点。也就是说p满足:
p > d或者p < -d (此为必要条件)
2015/11/1

38


Slide 39

More on Lines in the Plane
• 对于N条弯曲线,当且仅当任意两条弯曲线之间的
角度p满足上述条件,才可能两两相交出4个交点。
 360 
容易看出N至多为  d  。

• 可以将其转化成圆上放球问题:在圆周上放置半径
无穷小的球,使得两两之间的圆上距离不小于d。
其高维推广形式包括各类放球问题,如立方体内放
球问题等(very hard!!!)

2015/11/1

39


Slide 40

More on Lines in the Plane
• 接下来考虑,相交出4个交点的充分条件是什么?
在角点位置可以随意移动的条件下,p需要满足:
– 180 + d < p < – d或者d < p < 180 – d,也就是说
球p与第一个球的圆上距离大于d,小于180 – d

2015/11/1

40


Slide 41

More on Lines in the Plane
• 那么,最多有多少条曲线两两相交出4个交点?

• 显然,由蓝色球限制了剩余所有小球均在红色区段
上。易知红色区段内的小球之间的圆上距离不超过
180 - 2d,因此只需要使得其两两距离大于d即可。
对于不同红色区段上的球,圆上距离不小于2d,
因此需要使其两两距离小于180 – d。
2015/11/1

41


Slide 42

More on Lines in the Plane
• 显然,只要保持剩余的球都在红色区段内,就可以
忽略蓝色球的存在。因此,可调整上面红色区段内
最右端的球的位置,使之无穷逼近右端绿色分界点。
此时下端红色区段变成

2015/11/1

42


Slide 43

More on Lines in the Plane
• 接下来我们不停地上侧红色区段内放第3个球、第
4个球……下侧红色区段逐渐变化为:

• 看起来下侧红色区段就会慢慢消失……一直到最后
一个位置,哈,彻底消失了……

2015/11/1

43


Slide 44

More on Lines in the Plane
• 容易看出,消失的条件是:上侧红色区段的最左端
的球的位置在180 – d到180 – 2d之间。

• 在最后消失的情况中,上侧红色区段的球数为
下侧红色区段内没有球。这是最优情况吗?

2015/11/1

 180  2 d 


d





44


Slide 45

More on Lines in the Plane
• 我们随着红色区段的变化趋势来看看
• 上区段内的球数
图示
下区段可放球数
 180  3 d 

1


d




2

 180  4 d 


d





3

 180  5 d 


d





 180  2 d 


d



0



2015/11/1

45


Slide 46

More on Lines in the Plane
• 也就是说,在每个阶段,上下区段内的球数
 180  2 d 
 180  2 d 
之和是固定值  d  。因此总球数为  d  。
Hmm…应该是曲线条数….
• 对于d >= 90的情形,两条弯曲线之间的交点
至多有3个。如果使得两条弯曲线之间的夹
角任意地小,则可使得任意两条弯曲线之间
的交点数为3。

2015/11/1

46