数学归纳法
什么是数学归纳法
对于某些使用迭代法或者递归的代码,验证的时候可以避免一步步的计算,直接从理论上证明某个结论,节约大量的计算资源和时间,这就是数学归纳法。
数学归纳法的步骤
- 证明基本情况(通常是 n = 1 的时候)是否成立
- 假设n = k - 1 成立,再证明 n = k 也是成立的(k 为任意大于1的自然数)
数学归纳和递归的关系
递归调用的代码和数学归纳法的逻辑是一致的,只要证明数学归纳法的逻辑是对的,递归调用的逻辑就是对的,没必要纠结递归函数是如何嵌套调用和返回的
数学归纳法最大的特点就是在于归纳。它已经总结出了规律。只要能证明这个规律是正确的,就没必要进行逐步的推算,节省了很多时间还和资源
练习
-
背景
古印度国王舍罕酷爱下棋,他打算重赏国际象棋的发明人宰相西萨·班·达依尔。这位聪明的大臣指着象棋盘对国王说:“陛下,我不要别的赏赐,请您在这张棋盘的第一个小格内放入一粒麦子,在第二个小格内放入两粒,第三小格内放入给四粒,以此类推,每一小格内都比前一小格加一倍的麦子,直至放满 64 个格子,然后将棋盘上所有的麦粒都赏给您的仆人我吧!”
结果:从第一格到第8格的麦子分别是:1、2、4、8、16、24、32、64、128 、… -
分析
得出来的命题- 第n格的麦粒数是 2 n − 1 2^{n-1} 2n−1
- 前n个棋格订单麦粒总数和为 2 n 2^n 2n -1
证明
命题1证明
- 当n = 1 的时候,麦粒数:1,因此命题在n-1成立
- 当n = k - 1 时, k - 1格的麦粒数为 2 k − 2 2^{k-2} 2k−2, 那么第k格的麦粒数为第k-1格的2倍,也就是 2 k − 2 2^{k-2} 2k−2*2 = 2 k − 1 2^{k-1} 2k−1 因此命题在n=k-1成立,也就是n=k的时候也成立
命题2证明
- 当n = 1 的时候,所有格子的麦粒总数为1,因此命题在n = 1的时候成立
- 当n = k - 1 的时候,前k - 1 格的麦粒总数为2k-1-1,基于前一个命题的结论,第k格的麦粒数为2k-1。那么前k格的麦粒总数为(2k-1 -1)+(2k-1) = 2*2k-1-1= 2 k 2^k 2k-1 = 2 k 2^k 2k -1
图片引用于 极客时间–>黄申