【程序员必修数学课】->基础思想篇->数学归纳法->如何用数学归纳提高代码效率

本文探讨了数学归纳法的概念及其在优化代码效率中的应用。通过一个国际象棋麦粒问题的示例,解释了如何利用数学归纳法证明数列规律,以避免迭代计算,节省资源。同时,文章指出数学归纳法与递归调用的相似逻辑,帮助理解递归的本质。
摘要由CSDN通过智能技术生成

上一篇文章里,我说了数学中的迭代法,并用编程实现了国际象棋发明者的那个麦粒的计算问题,这篇文章我们就来看看数学归纳法。通过数学归纳法,我们能直接从理论上证明某个结论,从而避免很多计算,节约大量的计算资源和时间。

平常我们说的归纳,就是从大量经验事实中找出普遍特征的认知方法。我在我的一篇文章里,介绍了模式识别和机器学习的区别,其中机器学习就是一种归纳的方法,是自下而上的,这也是人类的许多体系的构成方法。

但是日常生活中所讲的归纳,和数学中的归纳还是不一样的。它们的区别是什么?具体数学归纳法可以做什么?下面我就来解答这些问题。

什么是数学归纳法?

回到国际象棋的发明人和麦粒的故事。

传说,印度的舍罕国王打算重赏国际象棋的发明人——大臣西萨·班·达依尔。这位聪明的大臣跪在国王面敢说:“陛下,请你在这张棋盘的第一个小格内,赏给我一粒麦子,在第二个小格内给两粒,在第三个小格内给四粒,照这样下去,每一小格内都比前一小格加一倍。陛下啊,把这样摆满棋盘上所有64格的麦粒,都赏给您的仆人吧?”国王说:“你的要求不高,会如愿以偿的”。说着,他下令把一袋麦子拿到宝座前,计算麦粒的工作开始了。……还没到第二十小格,袋子已经空了,一袋又一袋的麦子被扛到国王面前来。但是,麦粒数一格接一格地增长得那样迅速,很快看出,即使拿出来全印度的粮食,国王也兑现不了他对象棋发明人许下的语言。

在棋盘上放麦粒的规则是,第一格放一粒,第二个放两粒,以此类推,每一格都比上一格多一倍的麦子,直到放满64个格子。

如果你站在国王的身边,看着这个棋盘,你发现从第一格到第八格的麦子数分别是:1、2、4、8、16、32、64、128。这个时候你突然灵机一动,发现了棋盘的规律,第一格是1粒,也就是21 - 1粒,到了第二格,这两格的麦粒数总和就是 22 - 1。然后你猜测,到第 n 格的麦子总数就是 2n - 1 粒,所以到了第64格,总共就需要264 - 1粒麦子。

这时候你拿出和你一起穿越到古印度的计算器,264 - 1 = 18446744073709551615

然后就可以提醒国王他拿出全国的粮食都不够了。

这个假设是否成立,我们有待验证,但是类似这种无穷数列的问题,我们通常可以采用数学归纳法(Mathematical Induction)来证明。

在数论中,数学归纳法用来证明任意一个给定的情形都是正确的,也就是说,用第一个、第二个、第三个,一直到所有情形,概不例外。

数学归纳法的一般步骤是这样的:

  1. 证明基本情况(通常是 n = 1 的时候)是否成立;
  2. 假设 n = k - 1 成立,再证明 n = k 也是成立的(k 为任意大于 1 的自然数)。

我相信只要大家对高中数学还有印象,就对这个步骤很熟悉。

现在我们就用数学归纳法来证明上面的例子。我将上面的命题分为两个子命题来证明。

第一个子命题是:第 n 个棋格放的麦粒数为 2n-1
第二个子命题是:前 n 个棋格放的麦粒数总和为 2n - 1

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值