干粮 -- 计算机程序设计艺术(The Art of Computer Design) - 2
1.2 数学准备
在这一节,我们将会对本书中所用到的一些基本的数学记号和公式进行讲解.如果你不想过多的设计这些复杂的数学推导,至少应该熟悉一下各个公式的含义,以便能够更好的使理解这些公式.
我们主要在两个方面用到数学公式和记号,一是用来描述整个算法的各个部分,二是用来分析算法的性能.
1.2.1 数学归纳法
令P(n)为关于n(n为整数)的一个命题,例如,P(n)可以是:n乘以(n+3)是一个偶数,或者”如果n≥10,则2n>n3”,如果我们想证明P(n)的正确性,那么,我们可以依照一下的步骤来:
a) 证明P(1)为真
b) 证明 ”如果P(1),P(2),P(3),…,P(n)都为真,那么P(n+1)也为真.
例如,很久以前人们就已经发现了如下的等式:
1 = 12
1+3 = 22
1+3+5 = 32 ………………………………………………………………………………………………………………….(1)
1+3+5+7 = 42
1+3+5+7+9 = 52
于是我们可以大胆的假设
1+3+5+…+(2n-1) = n2 …………………………………………………………………………………………………..(2)
现在我们暂且把(2)式称为P(n),并希望能够证明P(n)对于任意的正整数n都成立,根据数学归纳法的步骤,我们需要:
a) P(1) 为真,因为 1 = 12
b) 如果 P(1),P(2),……,P(n)都为真.那么由于P(n)为真,于是等式(2)成立,在等式(2)的两边同时加上 (2n+1)则
1+3+…+(2n-1)+(2n+1) = n2 + 2n + 1 = (n+1)2
这样就证明了 P(n+1) 也为真
我们可以吧上面的步骤看做一个算法的证明步骤.
算法I: (构造一个证明).给出一个正整数n,这个算法将输出P(n)为真的证明
I1: [证明P(1)] 设k <- 1,并且根据a)输出一个P(1)的证明
I2: [k=n?] 如果k=n,那么算法终止,所需的证明已经输出
I3: [证明P(k+1)]根据b),输出一个关于”如果P(1),P(2),…,P(n)都为真,则P(k+1)为真”的证明.而且输出”我们已经证明了P(1),P(2),…,P(k),因此P(k+1)为真”
I4: [递增k] k加 1并转到I2.
该算法的框图:
由于这一算法显然给出了P(n)对任何给定的n的一个证明,因而我们知道,上述的证明技术(a),(b)在逻辑上是正确的(me:有点牵强啊,记得当初高代课,我们证明过,写了两大黑板的).这个证明方法就叫做数学归纳法证明.
需要注意的是,要把”数学归纳法”的概念和”归纳推理”区别开来.一个科学家通过特定的观察并且通过”归纳”,从而建立起说明这些事实的一般理论或假设.例如他可以通过观察(1)中的5个式子并且给出关系式(2).因此,归纳充其量不过是人们对某些事物的一些猜测.在数学领域里,我们将把这说成一个经验结果或一个猜测.
例如我们可以看看下面这个例子: 令P(n) 表示对n的划分的数目,也就是说,不管n的次序,把n写成若干个整数和的不同的方法的数目.由于:
5 = 1+1+1+1+1 = 2+1+1+1=3+1+1=2+2+1=3+2=4+1=5
因此我们有P(5) = 7.前几个值显然的我们可以得到
P(1) = 1, P(2) = 2, P(3)=3, P(4)=5, P(5)=7
那么,至此我们可以通过 “归纳”(me:注意,是归纳,不是数学归纳),而得出一个假设,P(n)将会跑遍所有质数. 为检验这个假设,我们来计算P(6) 而P(6) =11 和我们的推测是相符的.
(但是,很不荣幸的是,P(7)却等于15,完了,我们必须进行新的假设,)
而,另一方面,数学归纳法也完全不同于我们平常的”归纳”方法.它是有理有据的,而不是完全猜测的(me:有点熟悉,好像政治课本里面经常有这种语句). 实际上,由于对每个n都有一个结论,因而是无限多个的命题的一个证明.它之所以叫做数学归纳法,仅仅是因为,人们在应用数学归纳法之前需要稍微判定一下,他需要证明的是什么.