《程序员的数学》第 4 章 · 6–8 年级

数学归纳法

如何征服一条
永远看不到尽头的数列?
90 分钟
6 个站点
每站都有练习
可现场互动
开场 · 一个游戏

如果骨牌有一万张,你怎么把它们全部推倒?

先别急着算。
想象你站在这一排骨牌的前面——

你要做的事情有几件?

① 推倒第一张 ② 保证倒下的会带倒下一张

💡 神奇的地方:只要做到这 两件 事,不管骨牌排到第 100 张、第 100 亿张,还是无穷多张,它们全部都会倒。

开场 · 拆解

推倒无穷,其实只需要 两个 条件

这两件事,就是今天整节课的全部秘密。数学上把它们叫作「基底」和「归纳」。
1
推倒第一张

必须有人(或风)动手推第一下。否则,排得再整齐的骨牌也只会永远站着。

→ 数学里叫「基底 base」
2
每一张都能带倒下一张

第 k 张倒下时,一定能压到第 k+1 张。间距不能太大,也不能缺一张。

→ 数学里叫「归纳 induction」

今天我们要证明的「骨牌」,不是塑料做的,而是一句一句关于整数 n 的断言 —— 一共无穷多句。

课程地图

今天要走 6 站

每站学一个知识点,学完立刻练一道题。走完全程,你就能独立完成一次归纳法证明。
💰1 · 高斯求和

1 加到 100,9 岁高斯怎么 10 秒算完

🎯2 · 什么是断言

能被判断真假的句子,和一个就够了

🁢3 · 两个步骤

基底 + 归纳,征服无穷的正式武器

🔶4 · 奇数的和

1+3+5+… 为什么总是平方数

⚫5 · 陷阱

黑白棋怪题:看起来对,其实全错

💻6 · 写代码

程序员为什么天天在用归纳法

练习方式:先自己想 30 秒 → 再点「看答案」

今日目标:能独立写出一个完整的归纳法证明

第 1 站 · 高斯求和

存钱罐里的 5050 元

这是一个思考题,也是整节课的起点。

在你面前有一个空存钱罐:

第 1 天投入 1 元共 1 元 第 2 天投入 2 元共 1+2 = 3 元 第 3 天投入 3 元共 1+2+3 = 6 元 第 4 天投入 4 元共 1+2+3+4 = 10 元
1 2 3 ?

每天都这样投下去,第 100 天 时,罐子里一共有多少钱?

也就是求:1 + 2 + 3 + … + 99 + 100 = ?

第 1 站 · 硬算行不行

一个一个加,算得动吗?

最直接的办法:1 加 2,再加 3,再加 4……一直加到 100。这确实能算出来,但换个数字就麻烦了。
加 100 次
不到 2 分钟

笔算 + 计算器,很快就能搞定。

加 100 亿次
300 多年

就算计算器 1 秒加 1 次,也要算到你的曾孙的曾孙……

问题不在「会不会算」,而在「有没有更聪明的算法」。
而聪明算法的背后,正好藏着今天的主角:数学归纳法。

第 1 站 · 高斯的妙招

1786 年,一个 9 岁 男孩 10 秒交卷

老师让全班算 1 到 100 的和,本想清静半小时。高斯却几乎立刻写出了答案 —— 他没用计算器。
① 正着写一遍
123…99100
② 再倒着写一遍,两行相加
1009998…21
101101101…101101

每一列都是 101,一共 100 个 101

101 × 100 = 10 100
但这是两份的和(我们加了两次!)

10 100 ÷ 2 = 5050

1 次加法 + 1 次乘法 + 1 次除法,完事。

🔑 妙招的核心:把「一长串加法」变成「整齐的乘法」。首尾配对,每一对和都一样。

第 1 站 · 看图更清楚

阶梯砖块,倒过来拼 就是一个长方形

1+2+3+…+10 就是这样一个台阶。把它复制一份、倒过来、扣上去——正好补成一个长方形。

长方形:

11 行 × 10 列

面积 = 11 × 10 = 110 块砖

台阶只有它的一半:

110 ÷ 2 = 55

1+2+…+10 = 55 ✓

把 10 换成 n,长方形就是 (n+1) × n,于是和 = n(n+1)/2。

练习 1 · 现学现用

用高斯的办法算一算

不许一个一个加。先找「首尾配对数」,再想清楚一共配了几对、有没有落单。
练 1基础三连
  1. 1 + 2 + 3 + … + 50 = ?
  2. 1 + 2 + 3 + … + 1000 = ?
  3. 存钱罐问题:第 30 天时,罐子里一共多少钱?
练 2挑战
  1. 2 + 4 + 6 + … + 100 = ?(全是偶数,能借用高斯的方法吗?)

1. 首尾配对:1+50 = 51,一共 50 ÷ 2 = 25 对,所以 51 × 25 = 1275。

2. 1+1000 = 1001,共 1000 ÷ 2 = 500 对,1001 × 500 = 500 500。

3. 1+2+…+30 = (1+30) × 30 ÷ 2 = 31 × 15 = 465 元。

4. 提公因数 2:2+4+…+100 = 2 × (1+2+…+50) = 2 × 1275 = 2550。

第 1 站 · 收口

把「100」换成「n」,一句话概括全部

高斯真正厉害的地方:他的方法不只对 100 有效,对 200、对 100 亿、对任何整数都有效。

从 0 加到 n 的和

0 + 1 + 2 + 3 + ⋯ + n  =  n(n+1)2

这个等式里的 n 是「任意一个」整数,不是某一个具体的数。

代 n=10 → 10×11÷2 = 55

代 n=100 → 100×101÷2 = 5050

代 n=1000 → 1000×1001÷2 = 500500

❓ 但等一下 —— 我代了三个数都对,就能说它对所有整数 都成立吗?

这就是今天要解决的核心问题。答案,即将在第 3 站揭晓。

第 2 站 · 断言

先说清楚:什么是一句「断言」

断言 = 一句能明确判断出「真」或「假」的陈述句。没有真假可言的句子,不算断言。
✗ 不是断言
  • 「这道题好难啊!」(感叹,没有真假)
  • 「你作业写完了吗?」(疑问)
  • 「x + 1 = 3」(x 没定,无从判断)
✓ 是断言
  • 「7 是偶数。」→ 假
  • 「π 大于 3。」→ 真
  • 「对任意整数 n,n+1 > n。」→ 真

把断言里塞进一个 n,它就变成了一台「真假制造机」:

P(n):n × 2 是偶数 → P(0):0 是偶数 ✓ P(1):2 是偶数 ✓ P(7):14 是偶数 ✓
第 2 站 · 判断真假

这 6 句断言,哪些对所有 n ≥ 0 都成立?

规则:只要找到一个整数让它「假」,这句断言就 不是 对所有 n 成立。
A(n):n × 2 是偶数对所有 n 成立
B(n):n × 3 是奇数不成立 · n=2
C(n):n + 1 是 0 以上的整数对所有 n 成立
D(n):n − 1 是 0 以上的整数不成立 · n=0
E(n):n × 2 是 0 以上的整数对所有 n 成立
F(n):n ÷ 2 是 0 以上的整数不成立 · n=1

⚠️ 注意 D 和 F:它们对 很多 n 都成立(D 在 n≥1 时对,F 在 n 为偶数时对),但只要 有一个 反例,就不能说「对所有 n 成立」。

第 2 站 · 反例的威力

证明要一辈子,推翻只要 一秒

「对所有 n 成立」这句话有多难证?要检查无穷多个 n;但要推翻它,只要挑出一个坏的。

检查了 n = 0,1,2,3,…,99 全都对 ✓✓✓……

但 n = 100 时错了 ✗ —— 整句话立刻作废。

反例 = 一个就够

「所有天鹅都是白的」——你见过 10 万只白天鹅也没用,只要有 1 只黑天鹅,这句话就倒了。

所以做判断题时,先去找反例,是最省力的策略。

练习 2 · 找反例

判断真假,假的请举出一个反例

提示:先试 n = 0、1、2;如果都还成立,再试个大的。别只试一个数就下结论。
  1. P(n):n² > n(n ≥ 0)
  2. P(n):n² + n 是偶数(n ≥ 0)
  3. P(n):n + 3 > n + 1(n ≥ 0)
  4. P(n):n² 是 3 的倍数(n ≥ 0)
  5. 挑战:P(n):2n + 1 是奇数(n ≥ 0)。它显然一直对,但你能说明理由吗?

1. 假。反例 n = 0:0² = 0,不大于 0;n = 1 时 1 = 1 也不大于。(1 以后才都成立)

2. 真。n²+n = n(n+1),是两个相邻整数相乘。相邻两数必有一个偶数,所以乘积一定是偶数。

3. 真。两边同时减 n,就是 3 > 1,永远成立。

4. 假。反例 n = 1:1 不是 3 的倍数。(n=0、3、6… 时才成立)

5. 真。2n 一定是偶数,偶数加 1 一定是奇数。

第 2 站 · 收口

把高斯的结论,正式写成一句断言

断言 G(n)

0 + 1 + 2 + ⋯ + n  =  n(n+1)2

(对 0 以上的所有整数 n)

试出来几十个都对 ✓但无穷多个 n 试不完

画图能看懂 ✓但图只画得出一个具体例子

需要一把新武器 ⚔——数学归纳法

第 3 站 · 核心武器

数学归纳法:只做 两件事

要证明「断言 P(n) 对 0 以上的所有整数 n 都成立」,只需要——
1
基底(base):证明 P(0) 成立

亲自动手,把第一张骨牌推倒。(如果断言是"1 以上",那就证 P(1))

2
归纳(induction):证明「若 P(k) 成立,则 P(k+1) 也成立」

这里的 k 是任意的 0 以上整数。也就是:只要这一张倒了,下一张一定跟着倒。

🏁

两步都完成 ⟹ P(n) 对 0 以上的所有整数 n 都成立。

第 3 站 · 关键一问

凭什么两步就能搞定 无穷?

不要背结论,跟着这条链子往下看一眼就懂了。
P(0) 成立 ← 步骤 1 直接给出
P(1) 成立 ← P(0) 成立,而步骤 2 保证「P(0) ⇒ P(1)」
P(2) 成立 ← P(1) 成立,而步骤 2 保证「P(1) ⇒ P(2)」
P(3) 成立 ← P(2) 成立,而步骤 2 保证「P(2) ⇒ P(3)」
⋮ 就这样一级一级往上爬,没有尽头
P(n) 成立 ← 无论 n 多大,重复 n 次就够了

🧠 注意:我们没有真的去检查每一个 n。我们只证明了「第一步」和「传递规则」,剩下的交给推理完成 —— 这就是人类能谈论「无穷」的方式。

第 3 站 · 翻译表

骨牌 ↔ 归纳法,一一对得上

多米诺骨牌
数学归纳法
第 0 张骨牌被推倒
基底:P(0) 成立
第 k 张倒下会带倒第 k+1 张
归纳:P(k) ⇒ P(k+1)
骨牌间距合适、不缺张、不倒错方向
归纳步骤对任意 k 都成立(含 k=0)
结果:整排骨牌全倒
结果:所有 n 都成立
少了第一下 → 一张都不倒
漏了基底 → 结论不成立
中间断了一节 → 后面的全站着
归纳断链 → 结论不成立
第 3 站 · 最大疑惑

「凭什么可以假设 P(k) 成立?这不是循环论证吗」

这是几乎所有人第一次学归纳法时都会卡住的地方。连这本书的作者当年也卡在这里。
✗ 错误理解

「P(k) 不就是我要证的东西吗?先假设它成立,再推出它成立,这不等于什么都没证?」

✓ 正确理解

步骤 2 证明的不是「P(k) 是真的」,而是一句条件句:
「如果 P(k) 是真的,那么 P(k+1) 也一定真。」
条件句可以独立成立,与 P(k) 真假无关。

k n 目标 现在 起点:基底 P(0) 一级一级,都能迈上去

🪜 打个比方:n 是你要爬到的那一级(目标阶梯),k 只是你此刻站的这一级(途经阶梯)。归纳步骤说的是一件与你自己在哪儿有关的事:「站在第 k 级时,一定能迈上第 k+1 级」。

第 3 站 · 实战示范

用归纳法证明高斯的断言(上):基底

要证:0 + 1 + 2 + ⋯ + n = n(n+1)/2 对 0 以上的所有整数 n 成立。
步骤 1证明 G(0) 成立

把 n 全部换成 0,看左右两边是否相等:

左边

0 到 0 的和 = 0
=

右边

0 × (0+1) ÷ 2 = 0

左边 = 0,右边 = 0,两边相等 ⟹ G(0) 成立,基底证毕 ✓

💬 基底这一步通常最简单,只要代入算一下。但它绝对不能省 —— 没有它,「骨牌」一张都不会倒。

第 3 站 · 实战示范

用归纳法证明高斯的断言(下):归纳

假设 G(k) 成立,去推出 G(k+1)。只能用假设,不能直接说「显然」。

① 假设(记作 G(k))

0+1+⋯+k = k(k+1)2

② 要证明(记作 G(k+1))

0+1+⋯+k+(k+1) = (k+1)(k+2)2

③ 从左边出发,把①塞进去替换

0+1+⋯+k+(k+1) 前 k 项先留着
= k(k+1)2 + (k+1) 用假设 G(k) 换掉前 k 项
= k(k+1)2 + 2(k+1)2 通分,(k+1) 变分数
= k(k+1)+2(k+1)2 分母相同,分子相加
= (k+1)(k+2)2 提起公因式 (k+1)

这正是 ② 的右边 ⟹ 「G(k) ⇒ G(k+1)」成立,归纳证毕 ✓

第 3 站 · 抄下来

归纳法证明的 四行 标准格式

考试时按这个骨架写,一行都不会漏。

标准答题模板

① 要证:断言 P(n) 对 n ≥ 0(或 n ≥ 1)的所有整数成立。

② 基底:当 n = 0 时,左边 = ___,右边 = ___,相等,故 P(0) 成立。

③ 归纳:假设 P(k) 成立(k ≥ 0),即 ___。则当 n = k+1 时,
左边 = …(用上假设)… = 右边,故 P(k+1) 成立。

④ 结论:由数学归纳法,P(n) 对所有 n ≥ 0 成立。∎

❗ 一定写清「假设 P(k) 成立」——这是条件,不是结论。

❗ 最后一行别忘「由数学归纳法」——告诉老师你用的是这把武器。

第 3 站 · 避坑

少做一步,全部作废

两种最常见的翻车方式,看看你的答案属于哪一种。
翻车 A · 只证归纳,不证基底

有人这样"证明":
P(n):n = n + 1
假设 P(k) 成立,即 k = k+1,两边各加 1 得 k+1 = k+2,正是 P(k+1)。

归纳步骤完美,可整句话是错的。因为 P(0):0 = 1,一开始就不成立。骨牌第一张没人推。

翻车 B · 只试几个数,就说"对所有 n"

「1+3+5 = 9,1+3+5+7 = 16……我试了 5 个都对,所以对所有 n 都对。」

举例子永远不等于证明。下一站结束你会看到一个著名反例:前 16 个数全对,第 17 个就崩了。

✅ 正确姿势:基底 + 归纳,缺一不可。基底负责「起步」,归纳负责「传递」。

练习 3 · 动手证一次

轮到你了:证明 2+4+6+⋯+2n = n(n+1)

把空格补上,写完整四行。这是你人生第一个独立完成的归纳法证明。

① 要证:断言 P(n):前 n 个偶数之和 = n(n+1),对 n ≥ 1 成立。
② 基底:当 n = 1 时,左边 = ____,右边 = ____。
③ 归纳:假设 P(k) 成立,即 2+4+⋯+2k = ____。
则 n = k+1 时,左边 = 2+4+⋯+2k + ____ = ____(用假设)= ____,正是右边。
④ 结论:由数学归纳法,P(n) 对 n ≥ 1 成立。

② n=1:左边 = 2,右边 = 1×2 = 2,相等 ✓

③ 假设 2+4+⋯+2k = k(k+1)。则 n=k+1 时:
左边 = k(k+1) + 2(k+1) = (k+1)(k+2) = (k+1)((k+1)+1),正是 P(k+1) 的右边 ✓

④ 由数学归纳法,对一切 n ≥ 1 成立。∎
验证:n=5 时左边 = 2+4+6+8+10 = 30,右边 = 5×6 = 30 ✓

第 4 站 · 奇数的和

奇数一个个加起来,答案眼熟得可怕

先别管证明。拿起笔,把前几个奇数的和算出来,看看结果长什么样。

1

1

= 1²

1+3

4

= 2²

1+3+5

9

= 3²

1+3+5+7

16

= 4²

1+3+5+7+9

25

= 5²

猜想(断言 Q(n))

1 + 3 + 5 + ⋯ + (2n−1) = n²

前 n 个奇数加起来,正好是 n 的平方。

🤔 五个例子都成立 —— 但这也是「只试了几个数」。要真正确认,得请出归纳法。

第 4 站 · 看图就懂

每一次加奇数,就是给正方形镶一圈 L 形

1 块砖 → 加 3 块变 2×2 → 加 5 块变 3×3 → 加 7 块变 4×4 → 加 9 块变 5×5。

第 n 圈(L 形)有几块砖?

横边 n 块 + 竖边 n 块 − 拐角重复 1 块
= 2n − 1 块

拼到第 n 圈,就是一个 n × n 的大正方形,共 n² 块。

这个"镶边"动作,正好就是归纳步骤:
P(k):k×k 正方形 → 加一圈 2(k+1)−1 块 → P(k+1):(k+1)×(k+1)

第 4 站 · 正式证明

把「镶边」写成算式

要证:1+3+5+⋯+(2n−1) = n² ,对 1 以上 的所有整数 n 成立。
步骤 1基底:n = 1

左边 = 1
右边 = 1² = 1

相等 ⟹ Q(1) 成立 ✓

步骤 2归纳:Q(k) ⇒ Q(k+1)

假设 1+3+⋯+(2k−1) = k²

要证 1+3+⋯+(2k−1)+(2(k+1)−1) = (k+1)²

左边 = k² + (2k+1)
= k² + 2k + 1
= (k+1)²  ✓ 正是右边

看:k² + 2k + 1 = (k+1)² —— 这不是巧合,这是完全平方公式。数学里最漂亮的配合之一。

第 4 站 · 小工具

第 n 个奇数,为什么是 2n−1?

很多同学会把「2n−1」和「2n+1」搞混。其实只要看第一项对不对,就永远不会错。
第几个
奇数
验算 2n−1
第 1 个
1
2×1−1 = 1 ✓
第 2 个
3
2×2−1 = 3 ✓
第 3 个
5
2×3−1 = 5 ✓
第 n 个
2n − 1
每往后一个,就 +2

🔍 检验口诀:让 n=1,看是不是第一项

2n+1 从 3 开始,是「从第二个奇数起」的写法

常用换算:第 50 个奇数 = 2×50−1 = 99;第 100 个奇数 = 199。

第 4 站 · 灵活一点

基底不一定从 0 开始

归纳法要「从第一张骨牌开始推」。如果断言说的是「n ≥ 1 时成立」,那第一张骨牌就是 n = 1。
断言:对所有 n ≥ 0 0 1 2 3 … 基底证 P(0) 断言:对所有 n ≥ 1(例如 Q(n)) 1 2 3 4 … ← 基底证 P(1)

归纳步骤里的 k 也要跟着改:

从 0 开始 → 「对任意 k ≥ 0」
从 1 开始 → 「对任意 k ≥ 1」

范围写错,常常就是隐藏的漏洞(第 5 站会看到一个真实的翻车案例)。

练习 4 · 用起来

把 n² 用起来

不用一个个加。先想清楚:最后一个奇数是第几个?
  1. 1 + 3 + 5 + ⋯ + 99 = ?
  2. 第 10 个奇数是多少?前 10 个奇数之和是多少?
  3. 1 + 3 + 5 + ⋯ + (2×12−1) = ?
  4. 挑战:101 + 103 + 105 + ⋯ + 199 = ?

1. 99 = 2n−1 ⟹ n = 50,所以和 = 50² = 2500。

2. 第 10 个奇数 = 2×10−1 = 19;前 10 个之和 = 10² = 100。

3. 2×12−1 = 23 是第 12 个奇数,和 = 12² = 144。

4. 101 是第 51 个,199 是第 100 个。所以
原式 = (1+3+⋯+199) − (1+3+⋯+99) = 100² − 50² = 10000 − 2500 = 7500。
也可以直接数:一共 (199−101)÷2+1 = 50 项,平均 (101+199)÷2 = 150,50×150 = 7500。

第 4 站 · 连到课本

这道题,你在七年级一定见过

用小棒摆正方形:摆 1 个用 4 根,摆 2 个用 7 根……摆 n 个用几根?

规律:每多摆一个正方形,只新增 3 根(有一条边是和前一个共用的)。

4, 7, 10, 13, ⋯ ⟹ 3n + 1

归纳法证明:
基底 n=1:3×1+1 = 4 ✓
归纳:T(k+1) = T(k) + 3 = (3k+1) + 3 = 3(k+1)+1 ✓

📚 老师说的「找规律」,本质就是先猜出 T(n),再用归纳法确认它永远不会出错。猜 + 证,缺一不可。

第 5 站 · 陷阱

现在,我要「证明」一件荒唐的事

黑白棋一面白一面黑。现在往桌上随便扔 n 枚,颜色肯定乱七八糟 —— 但下面这段话,看起来完全符合归纳法。

断言 T(n)

投掷 n 枚黑白棋,所有棋子的颜色一定相同。(n ≥ 1)

这个断言显然是假的。可是——

我能用它推出一份看起来毫无破绽的「证明」。
你的任务:找出错在哪一步。

第 5 站 · 伪证

那份「证明」长这样

步骤 1 · 基底

证明 T(1):只扔 1 枚棋子,颜色当然只有 1 种。✓

步骤 2 · 归纳

假设 T(k) 成立:任意 k 枚棋子颜色都相同。
现在扔了 k+1 枚,把它们分成两组:
A 组:第 1 ~ k 枚(k 枚);B 组:第 2 ~ k+1 枚(k 枚)

由假设,A 组内部同色,B 组内部同色;
而 A、B 有重叠的棋子,颜色必须一致。
⟹ k+1 枚全同色,即 T(k+1) 成立。✓

步骤 1+2 都完成 ⟹ T(n) 对所有 n ≥ 1 成立。

k = 4 时的分法(k+1 = 5 枚)

🔎 每一步都「说得通」,结论却荒唐。错的不是算术,而是某个隐含的条件。

⏸ 课堂暂停 · 30 秒
请找出那个
藏起来的 k
提示:这段推理说「A 组和 B 组一定有重叠的棋子」。
那么请你试试最小的那个情况 —— k = 1。
A 组 = { 第 1 枚 }
B 组 = { 第 2 枚 }
第 5 站 · 真相

k = 1 时,两组根本没有重叠

重叠部分的棋子数是 k − 1 枚。当 k = 1 时,k − 1 = 0 —— 没有公共棋子,两个"同色"的组没有任何桥梁。

k = 4(成立)

重叠 3 枚 ⟹ A、B 被"钉"在一起 ⟹ 结论成立。

k = 1(断裂)

重叠 0 枚 ⟹ 左边白、右边黑,谁也没矛盾 ⟹ 归纳断了。

所以「T(k) ⇒ T(k+1)」并不是对所有 k ≥ 1 都成立,它只在 k ≥ 2 时成立。
从 k=1 到 k=2 这一步跨不过去,整条链子在第一环就断了。

第 5 站 · 经验

图很方便,但图会骗人

作者在书里特意提醒:不要被图迷惑。下面这份检查清单,建议你做题时默念一遍。
① 图画的是"一般情况",但边界情况呢?

画 k=4、k=5 都很舒服,偏偏 k=1、k=0 画不出来、也不好画 —— 而漏洞常常就藏在最小的那个数上。

② 归纳步骤是不是偷偷多用了条件?

黑白棋的伪证悄悄用了一句「两组有重叠」,这句只在 k ≥ 2 时才真。用之前,先问:它对任意 k 都成立吗?

③ 基底和归纳的范围,写的一致吗?

「n ≥ 1 成立」的断言,归纳步骤就要对 任意 k ≥ 1 成立。黑白棋的链条要从 k=1 传到 k=2,恰恰传不过去。

练习 5 · 当侦探

前 16 个全对,第 17 个崩了

有人发现:n²+n+17 在 n = 0,1,2,… 时算出来都是质数。他宣布:「所以它对所有 n 都是质数。」
171923293747597389107127149173199227257289

n = 0,1,2,…,15 对应前 16 个数(都是质数);最后一个是 n = 16。

  1. n = 16 时,16²+16+17 等于多少?它是质数吗?
  2. 这件事告诉我们:验证了很多个例子,能不能代替证明?
  3. 回头看黑白棋:它违反了上面检查清单的哪一条?

1. 256 + 16 + 17 = 289 = 17 × 17,不是质数。反例找到了,断言作废。

2. 不能。举多少个例子都只是「验证」,不是「证明」。整整 16 个对的例子,抵不过 1 个反例;而要想证明无穷多个 n,只能靠归纳法。

3. 违反了第 ② 条和第 ③ 条:它在 k=1 时偷偷用了「两组有重叠」,也就是归纳步骤并没有对所有 k ≥ 1 成立。

第 6 站 · 换个身份

在程序员眼里,归纳法就是 一个循环

你在数学课上学的两步,写进代码里就是这几行。仔细看,它们严丝合缝。
// 证明 P(n) 对任意 n 成立
prove(n) {
  k = 0;     // 步骤1 基底
  while (k < n) {
    // 步骤2:P(k) ⇒ P(k+1)
    k = k + 1;
  }
  return "P(n) 成立";
}
// prove(3) 的运行结果
现在开始证明 P(3)
根据步骤1,P(0) 成立
根据步骤2,P(0)⇒P(1),P(1) 成立
根据步骤2,P(1)⇒P(2),P(2) 成立
根据步骤2,P(2)⇒P(3),P(3) 成立
证明结束 ∎

💡 循环变量 k 就是「骨牌的第几号」。基底把 k 归零、推倒第一张;循环体每次让它前进一格。

第 6 站 · 循环不变式

怎么知道一个循环 写对了?

下面这个函数求数组元素之和。代码只有 6 行,但它凭什么是对的?
int sum(int a[], int size) {
  int k = 0;
  int s = 0;
  while (k < size) {
    s = s + a[k];
    k = k + 1;
  }
  return s;
}

循环不变式 M(k)

程序执行到循环开头时,s 永远等于数组前 k 个元素之和。

也就是:s = a[0] + a[1] + ⋯ + a[k−1]

「不变式」就是归纳法里的那句断言 P(n)。
只要证明它在循环里一直保持,就等于证明了函数是对的。

写循环前先问自己一句:「这个循环的不变式是什么?」—— 能问出这句话,你就已经比大多数初学者少踩坑了。

第 6 站 · 三步对上了

把 M(k) 标在每一行上

int sum(int a[], int size) {
  k = 0; s = 0;  // ① M(0):前0个之和 = 0 = s
  while (k < size) {
    // ② 此时 M(k) 成立
    s = s + a[k]; // ③ 加入第 k+1 个 ⟹ M(k+1)
    k = k + 1;
  }
  // ④ 循环结束:k = size ⟹ M(size)
  return s;
}
① 初始化
基底:M(0) 成立
② 循环条件
假设 M(k) 成立
③ 循环体
归纳:推出 M(k+1)
④ 离开循环
结论:k = size

循环做了两件事:达到目的(s 变成总和)、适时结束(k 追到 size)。
不变式管第一件,k 递增管第二件。

练习 6 · 你是程序员

给这个求阶乘的循环,写出不变式

阶乘:n! = 1 × 2 × 3 × ⋯ × n。比如 4! = 24。
int fact(int n) {
  int k = 0;
  int f = 1;
  while (k < n) {
    k = k + 1;
    f = f * k;
  }
  return f;
}
  1. 它算出来的结果对吗?先用 n=4 手动跑一遍。
  2. 写出循环不变式 M(k)。
  3. 哪一行是「基底」?哪一行是「归纳」?

1. k=1,f=1;k=2,f=2;k=3,f=6;k=4,f=24 ⟹ 4! = 24 ✓

2. M(k):f = 1 × 2 × ⋯ × k = k!

3. 基底:f=1(此时 k=0,0! = 1)。
归纳:f = f * k —— 若 f 原是 (k−1)!,乘上 k 就变成 k!,即 M(k−1) ⇒ M(k)。
结束时 k = n,M(n) 成立,所以 return 的 f 就是 n! ✓

回顾 · 知识地图

整节课,其实就这一条线

第 1 步
写出断言
P(n)
→
第 2 步 · 基底
证明 P(0)
推倒第一张
→
第 3 步 · 归纳
若 P(k) 则 P(k+1)
每一张带倒下一张
→
第 4 步 · 收
对所有 n 成立
∎ 证明结束
🔍 直观:看得见的证明

阶梯拼长方形 n(n+1)/2;L 形镶边拼正方形 n²。
图能帮你猜结论,但不能代替证。

⚠️ 陷阱:黑白棋

基底对、归纳看着也对,但 k=1 时「两组有重叠」是假的。
边界情况要单独检查。

💻 应用:循环不变式

写循环前先说出「不变式」,就等于给程序写了一份归纳法证明。

最后 · 记住三句话

一推、二传、三收

一推

基底:把第一张推倒
P(0) 或 P(1)

二传

归纳:P(k) ⇒ P(k+1)
对任意 k 都要成立

三收

结论:由数学归纳法
对所有 n 成立 ∎

考前速查 · 四个高频失误

① 忘了证基底 ② 归纳步骤没用上假设 ③ 只在 k 的某个范围里成立 ④ 拿几个例子当证明
终极挑战

两道题,检验你今天是否真的学会了

题 1独立完成一个证明

用数学归纳法证明:1 + 2 + 4 + 8 + ⋯ + 2n = 2n+1 − 1(对 n ≥ 0)。
提示:从 k 到 k+1,只是多了一项 2k+1。

题 2这次当裁判

有人"证明":1 + 3 + ⋯ + (2n−1) = n² + 1。
他的归纳步骤:假设成立,则两边同加 2k+1 得 k²+1+2k+1 = (k+1)²+1 —— 完全正确。
那么,这个证明错在哪里?

题 1. ① 基底 n=0:左边 = 1,右边 = 2¹−1 = 1 ✓
② 归纳:假设 1+2+⋯+2k = 2k+1−1,则
1+2+⋯+2k+2k+1 = 2k+1−1+2k+1 = 2·2k+1−1 = 2k+2−1,正是 P(k+1) ✓
③ 由数学归纳法,对一切 n ≥ 0 成立。∎

题 2. 错在基底不成立。n=1 时左边 = 1,右边 = 1²+1 = 2,不相等。
归纳步骤再漂亮也没用 —— 第一张骨牌没倒,后面永远不会倒。(这正是「翻车 A」)

彩蛋 · 一个古老的故事

棋盘上的 2ⁿ,能把国王掏空

传说一位大臣发明了国际象棋,国王问他要什么赏赐。他说:棋盘第一格放 1 粒麦子,第二格 2 粒,第三格 4 粒……每一格都翻一倍就好。

每一格里的麦粒数,就是"上一格 × 2":

1, 2, 4, 8, 16, 32, 64, 128, ⋯

第 64 格 = 263 粒 ≈ 92 亿亿粒。

全部加起来 = 264 − 1 ≈ 1844 亿亿粒,按今天的产量要种几千年。国王当然付不起。

而"1+2+4+⋯+2n = 2n+1−1",正是你刚才在终极挑战里亲手证过的那条式子。

回顾 · 课后对话
「假设一条腿可以往前迈一步;
再假设另一条腿无论什么情况都能迈出去。」
「那样的话,就能走到无限的远方。」
这就是数学归纳法 —— 不是因为看得远,而是因为每一步都算数。
《程序员的数学》第 4 章 · 如何征服无穷数列
用 ← → 翻页 · F 全屏 · P 打印 · 点击「看答案」展开解析