数学归纳法应用场景
与正整数有关的数学问题;
(高中数学)证明等式成立、证明数列通项公式成立。
数学归纳法基础结构
1. 证明 n=1 时表达式成立(可能存在特殊情况,把特殊情况单独列出,排除干扰);
2. 证明 如果当 n=m 时表达式成立,则 n=m+1 时表达式同样成立。
类似多米诺骨牌效应:1 是推到 第一块骨牌;2 是证明 骨牌之间的空隙 足以让 前一块压倒后一块。
(图片来自网络)
循环不变式
循环不变式指的是:在每轮迭代开始前和结束后,我们要操作的数据必须保持的某种特性(比如在插入排序中,数组前面部分必须是递增/递减的)。
循环不变式是进行循环的必备条件,因为它保证了循环进行的有效性。
循环不变式 (loop invariant)用来帮助我们理解算法的正确性。 (出自《算法导论中文版》第二章 2.1 插入排序)
对于循环不变式,必须证明它的三个性质:(与数学归纳法类似,但是归纳步骤是无穷使用的;而循环不变式循环结束相当于终止归纳)
- 初始性:在循环的第一轮迭代开始之前,应该是正确的;
- 保持:如果循环的第一次迭代开始之前正确,那么,在下一次迭代开始之前,它也应该保持正确;
- 终止:当循环结束时,不变时给了我们一个有用的性质,它有助于表明算法是正确的。
循环不变式的应用 属于 算法设计模式中的 增量模式(incremental),算法过程是一个一个往上线性递增推导。
递归
在计算机编程中,递归指函数不断调用自身的过程。
如果用 fn(n) 指代递归函数(其中 n 是正整数),那么 fn(n) 中会调用它自身 fn(n-m) 。
当 fn(n) 中只调用 fn(n-1) 时,此时递归的过程 可以看做是 数学归纳法 的反向过程。
下图是某个比较简单的递归例子,在递归函数中,只调用自身一次,而且是调用 fn(n-1),可以看出与数学归纳法比较相近。
递归的性质:
1. 一个问题可以分成一个或多个子问题,子问题会更加简单;
2. 不能无限调用自身,当递归到一定程度,子问题可以用非递归方法解决,结束递归。
递归与 数学归纳法 的相同之处:
1. 存在可解的最小子问题;
2. 大问题可以从小问题的结果出发解决;
3. 如果不限制时间空间,都可以解决无限增长的问题。