纸上谈兵: 数学归纳法, 递归, 栈
数学归纳法
数学归纳法(mathematical induction)是一种数学证明方法,常用于证明命题(命题是对某个现象的描述)在自然数范围内成立。随着现代数学的发展,自然数范围内的证明实际上构成了许多其他领域(比如数学分析)的基础,所以数学归纳法对于整个数学体系至关重要。
数学归纳法本身非常简单。如果我们想要证明某个命题对于自然数n都成立,那么:
第一步 证明命题对于n = 1成立。
第二步 假设命题对于n成立,n为任意自然数,证明在此假设下,命题对于n+1成立。
命题得证
想一下上面的两个步骤。它们实际上意味着,命题对于n = 1成立 -> 命题对于n = 2成立 -> 命题对于n = 3成立……直到无穷。因此,命题对于任意自然数都成立。这就好像多米诺骨牌,我们确定n的倒下会导致n + 1的倒下,然后推倒第一块骨牌,就能保证任意骨牌的倒下。
我们来看一下使用数学归纳法来证明高斯求和公式:
n为任意自然数。
(这个公式据说是高斯小学时想出来的。老师惩罚全班同学,必须算出1到100的累加,才能回家。于是高斯想出了上面的方法。天才都是被逼出来的么?)
我们的命题是: 高斯求和公式对于任意自然数n都成立。
下面为数学归纳法的证明步骤:
第一步 n = 1,等式左边(1的累加)为1,右边(右边公式代入n=1)也为1,等式两边相等,等式成立,因此命题对于 n = 1 成立。
第二步 假设上述公式对于任意n成立, 即1到n的累加为n*(n+1)/2
那么,对于n+1,等式的左边(从1到n+1的累加)等于n*(n+1)/2 + (n+1),即(n+1)*(n+2)/2,
等式的右边的n用n+1代替,成为(n+1)*(n+2)/2,
等式两边相等,等式成立。因此,当假设命题对于n成立时,命题对于n+1成立。
因此,命题得证。
递归
递归(recursion)是计算机中的重要概念,它是指一个计算机程序调用其自身。为了保证计算机不陷入死循环,递归要求程序有一个能够达到的终止条件(base case)。比如下面的程序,是用于计算高斯求和公式:
/*
* Gauss summation
int f(n)
if (n == 1) {