跳到正文
组合计数 · 第 10 章

递推

要数大的,先数小的:先算出初始值,再用递推从前面的值算出后面的值;规则更难时,就用两个状态一起列表。

你需要先会
在 YouTube 上打开
10.10%

递推基础

在本节中,你将能够 从较小的答案一步步算出较大的答案,数出爬楼梯的方法数。

Jeff 爬一段 6 级的楼梯,每步跨 1 级或 2 级。把所有爬法都列出来太慢了。你能不列举就数出来吗?

别直接去攻第 6 级。先问一个更小的问题:到达第 1 级有几种方法?第 2 级呢?再问:登上某一级的最后一步可能从哪里出发? 这样,一个大的计数问题就变成了一串小的计数问题。

注意:每一种爬到第 nn 级的爬法,都以某一步结束。按这最后一步的起点把爬法分类。

动手探索先玩,再学公式

6 级台阶,每步跨 1 或 2 级:f(6) = 13 种方法

台阶数6
步长:
0123456顶
求 f(6):到达第 6 级的方法数

每步跨 1 或 2 级。

每步跨 1 或 2 级。表格已填到第 0 级。

认识概念

定义 10.1.1 · 递推

递推就是先求出较小的值,再用它们计算较大的值。

注 10.1.2 · 斐波那契?

注意:1,2,3,5,8,131, 2, 3, 5, 8, 13 这些数正好是斐波那契数列。这是因为递推 f(n)=f(n−1)+f(n−2)f(n) = f(n-1) + f(n-2) 和斐波那契数列的递推一样。但并不是每道递推题都这样。

注 10.1.3 · 工程归纳法

递推题的答案常常可以用工程归纳法得到:算出前几个值,找出规律,然后相信它。(参见第 45 章中关于应试技巧的一节。)

看例题先预测,再揭晓

例 10.1

Jeff 在爬一段 6 级的楼梯。如果他每次可以爬 1 级或 2 级,那么他有多少种不同的方法爬到顶?

爬楼梯 (总数在例题最后一步揭晓)

0123456顶
求 f(6):到达第 6 级的方法数

每步跨 1 或 2 级。

每步跨 1 或 2 级。表格已填到第 0 级。

  1. 1

    分类讨论会花很长时间。不如从小处入手。Jeff 到达第 0 级(地面)有多少种方法?

    先预测一下:

自己做

习题 10.5.1

AMC

Jo 每天在学校都要爬一段 6 级的楼梯。Jo 每次可以爬 1 级、2 级或 3 级。例如,Jo 可以先爬 3 级,再爬 1 级,再爬 2 级。Jo 爬这段楼梯有多少种方法?

6 级台阶,每步跨 1、2 或 3 级:f(6) = 24 种方法

0123456顶
f(3) = f(2) + f(1) + f(0) = 2 + 1 + 1 = 4

每步跨 1、2 或 3 级。

f(3) = f(2) + f(1) + f(0) = 2 + 1 + 1 = 4。表格已填到第 3 级。

过关检测(第 10.1 节)

3 题中答对 2 题即可掌握本节。每题只有一次机会,没有提示。
1

Jeff 每次爬 1 级或 2 级。爬一段 8 级的楼梯有多少种方法?

2

一只青蛙每次跳上 1 级或 3 级台阶。它到达第 6 级有多少种方法?

3

每步跨 1 级或 2 级时,f(7)=21f(7) = 21,f(8)=34f(8) = 34。f(9)f(9) 是多少?

10.20%

有限制的递推

在本节中,你将能够 在规则中途改变时,建立初始值和递推。

Mike 每步跨 2 级或 3 级,但到了第 9 级,他可以迈一级登顶。结尾多了一条特殊规则。递推会因此失效吗?

每道递推题都走同样的四步:先自己数出初始值,再根据“从哪里到达”写出递推,然后一个一个算出后面的值。 特殊规则只是改变你要把哪些格子加起来,以及在哪里加。

注意:往回看 3 步的递推,需要先有 3 个初始值,才能自己运转起来。

动手探索先玩,再学公式

10 级台阶,每步跨 2 或 3 级(最后一步可跨 1、2 或 3 级):f(10) = 12 种方法

台阶数10
步长:
012345678910顶
求 f(10):到达第 10 级的方法数

每步跨 2 或 3 级;登上第 10 级的最后一步可以跨 1、2 或 3 级。

每步跨 2 或 3 级。最后一步可以跨 1、2 或 3 级。表格已填到第 0 级。

认识概念

概念 10.2.1 · 递推法

用递推解题分几步:

  1. 自己动手解出几个较小的初始值。
  2. 一般来说,递推式右边有几项,就需要几个初始值。
  3. 对一般的 f(n)f(n),看看到达这一步有哪些不同的方式,用前面的值写出递推式。
  4. 一步一步计算 f(n)f(n),直到算出你要的那个数。

注 10.2.2 · f(0) = 1

你也可以把 f(0)=1f(0) = 1 当作初始值:到达第 0 级一步也不用走,而这样做恰好有 1 种方法。这样可能更快,不过一开始会有点绕,所以例题里不用它。做习题时可以放心用。

注 10.2.3 · 初始值多求几个没坏处

初始值求多了永远没坏处。如果递推中遇到一个你不确定怎么算的值(比如 f(2)f(2) 或 f(3)f(3)),就回头再自己多数几个初始值。

看例题先预测,再揭晓

例 10.2

Mike 在爬一段 10 级的楼梯。他很赶时间,所以大部分路程每次爬 2 级或 3 级。如果他到达了第 9 级,就可以再爬 1 级到达第 10 级。Mike 爬到楼梯顶有多少种方法?

爬楼梯 (总数在例题最后一步揭晓)

012345678910顶
求 f(10):到达第 10 级的方法数

每步跨 2 或 3 级;登上第 10 级的最后一步可以跨 1、2 或 3 级。

每步跨 2 或 3 级。最后一步可以跨 1、2 或 3 级。表格已填到第 0 级。

  1. 1

    从初始值开始。Mike 到达第 1 级有多少种方法?

    先预测一下:

过关检测(第 10.2 节)

3 题中答对 2 题即可掌握本节。每题只有一次机会,没有提示。
1

一个递推式是 f(n)=f(n−1)+f(n−2)+f(n−4)f(n) = f(n-1) + f(n-2) + f(n-4)。开始使用它之前,你需要几个初始值?

2

Ana 爬 9 级楼梯,每次爬 2 级或 3 级。她爬到顶有多少种方法?

3

每步跨 1 级或 2 级,但第 3 级坏了,不能踩。到达第 6 级有多少种方法?

10.30%

更复杂的递推

在本节中,你将能够 通过插入最新的对象,或者考虑最后一个对象的情况,找出递推。

八个正方体,棱长 1 到 8,叠起来时每个正方体至多比下面那个大 2。叠法有成千上万种。有多少种是合法的?

对象不是台阶时,爬楼梯的技巧照样管用。用规模 n−1n-1 的答案构造规模 nn 的答案。 对于塔,把最大的正方体插入较小的塔。对于集合,就问 nn 本身选不选。

注意:如果每个大的排法都恰好来自一个小的排法,计数就只是相乘。

动手探索先玩,再学公式

用棱长 1 到 8 的正方体搭塔,k 上面的正方体棱长至多是 k + 2,把最大的数插入较小的数的合法排法来构造:T(8) = 1458

123

从下到上 · 4 可以放在哪里?

123
4 个位置中,有 3 个可以放 4。

1, 2, 3。4 个位置中,有 3 个可以放 4。

认识概念

注 10.3.1 · 检验你的递推

要检验递推式,就自己数几个小的情况,看看递推给出的数是否一样。

看例题先预测,再揭晓

例 10.3

AIME

一组 8 个正方体,对每个满足 1≤k≤81 \le k \le 8 的整数 kk,都恰有一个棱长为 kk 的正方体。要用全部 8 个正方体按以下规则搭一座塔:

  • 任何一个正方体都可以放在塔的最底层。
  • 紧挨着放在棱长为 kk 的正方体上面的那个正方体,棱长至多为 k+2k+2。

设 TT 为可以搭出的不同的塔的个数。TT 除以 1000 的余数是多少?

插入构造器 (总数在例题最后一步揭晓)

123

从下到上 · 4 可以放在哪里?

123
4 个位置中,有 3 个可以放 4。

1, 2, 3。4 个位置中,有 3 个可以放 4。

  1. 1

    设 T(n)T(n) 为用正方体 11 到 nn 搭成的合法的塔的个数。T(2)T(2) 是多少?

    先预测一下:
在 YouTube 上打开

例 10.4

AMC 12

如果一个整数集合中,任意三个连续整数里至多只有一个属于它,就称这个集合是稀疏的。{1,2,3,…,12}\{1, 2, 3, \ldots, 12\} 有多少个子集(包括空集)是稀疏的?

字符串状态表 (总数在例题最后一步揭晓)

n3

稀疏集:任意连续三个数中至多选一个

a(3): 选了 n · 1

  • {3}

b(3): 没选 n · 3

  • ∅
  • {2}
  • {1}
a(3) = 1:初始值,要自己数出来b(3) = 3:初始值,要自己数出来n = 3 时的总数:a(3) + b(3) = 4

虚线框的列是初始值,要自己数出来。描边的格子是所选列的来源。

稀疏集:任意连续三个数中至多选一个。a(3) = 1:初始值,要自己数出来。b(3) = 3:初始值,要自己数出来。n = 3 时的总数:a(3) + b(3) = 4。

  1. 1

    设 S(n)S(n) 为 {1,…,n}\{1, \ldots, n\} 的稀疏子集的个数。自己数出 S(1)S(1)、S(2)S(2) 和 S(3)S(3)。S(3)S(3) 是多少?

    先预测一下:
在 YouTube 上打开

竞赛角真实竞赛题

习题 10.5.5(补充题)

AIME

对整数 1,2,…,n1, 2, \ldots, n 的一个排列 a1,a2,…,ana_1, a_2, \ldots, a_n,如果对每个 1≤k≤n−11 \le k \le n-1 都有 ak≤ak+1+2a_k \le a_{k+1} + 2,就称它是准递增的。例如,5342153421 和 1425314253 是整数 1,2,3,4,51, 2, 3, 4, 5 的准递增排列,而 4512345123 不是。求整数 1,2,…,71, 2, \ldots, 7 的准递增排列的个数。

1 到 7 的排列,每一项至多是后一项 + 2,把最大的数插入较小的数的合法排法来构造:T(7) = 486

从左到右 · 5 可以放在哪里?

1234
5 个位置中,有 3 个可以放 5。

1, 2, 3, 4。5 个位置中,有 3 个可以放 5。

习题 10.5.8(补充题)

AIME挑战

求 1,2,3,4,5,61, 2, 3, 4, 5, 6 的排列的个数,使得对每个满足 1≤k≤51 \le k \le 5 的 kk,排列的前 kk 项中至少有一项大于 kk。

1 到 6 的排列,对每个 k,前 k 项中至少有一项大于 k,用全部排列减去最早在 k 处不满足的排列来计数:T(6) = 461

  • k=1: 最大 6 > 1 ✓
  • k=2: 最大 6 > 2 ✓
  • k=3: 最大 6 > 3 ✓
  • k=4: 最大 6 > 4 ✓
  • k=5: 最大 6 > 5 ✓
每一项检查都通过:这个排列符合要求。

T(6) = 6! − (T(1)·5! + T(2)·4! + T(3)·3! + T(4)·2! + T(5)·1!) = 720 − 259 = ?

6, 5, 4, 3, 2, 1。每一项检查都通过:这个排列符合要求。

过关检测(第 10.3 节)

3 题中答对 2 题即可掌握本节。每题只有一次机会,没有提示。
1

用棱长为 1 到 nn 的正方体搭塔;放在正方体 kk 上面的正方体棱长至多为 k+2k + 2。用上全部正方体 1 到 5 的塔有多少座?

2

{1,2,…,8}\{1, 2, \ldots, 8\} 有多少个稀疏子集(任意三个连续整数中至多有一个,包括空集)?

3

你的递推式说,用多米诺骨牌铺满 2×32 \times 3 棋盘的方法数是 f(3)=f(2)+f(1)f(3) = f(2) + f(1)。你知道 f(1)=1f(1) = 1,f(2)=2f(2) = 2。自己动手验证一下:2×32 \times 3 棋盘有多少种铺法?

10.40%

多个递推函数

在本节中,你将能够 同时记录两个计数,按字符串的结尾来区分。

一条街上有 19 户人家,邮递员从不给相邻两家同时送信,也从不连续三家都不送信。可能的送信方式有多少种?

这里一个计数不够用:接下来能怎么送,取决于这种送信方式怎么结尾。所以要记两个计数:a(n)a(n) 表示以收到信结尾的方式数, b(n)b(n) 表示以没收到信结尾的方式数。两者互相递推。

注意:答案是两个计数的组合,这里是 a(19)+b(19)a(19) + b(19)。

动手探索先玩,再学公式

送信:相邻两家不同时收信,不连续三家都没信。状态 a(n): 最后一家收到信; b(n): 最后一家没收到信。n = 19 时共有 351 种送信方式。

模关
n4

送信:相邻两家不同时收信,不连续三家都没信

a(4): 最后一家收到信 · 2

b(4): 最后一家没收到信 · 3

a(4) = b(3) = 2b(4) = a(3) + a(2) = 2 + 1 = 3n = 4 时的总数:a(4) + b(4) = 5

虚线框的列是初始值,要自己数出来。描边的格子是所选列的来源。

送信:相邻两家不同时收信,不连续三家都没信。a(4) = b(3) = 2。b(4) = a(3) + a(2) = 2 + 1 = 3。n = 4 时的总数:a(4) + b(4) = 5。

认识概念

概念 10.4.1 · 两个递推函数

很多时候,定义两个递推函数会更简单,比如 a(n)a(n) 和 b(n)b(n),真正的答案是两者的某种组合(例如 a(n)+b(n)a(n) + b(n))。

看例题先预测,再揭晓

例 10.5

AIME 2001

一位邮递员给 Elm 街东侧的十九户人家送信。邮递员注意到,同一天里从来没有相邻的两户都收到信,但同一天里也从来没有超过两户连续都没收到信。可能的送信方式有多少种?

字符串状态表 (总数在例题最后一步揭晓)

n3

送信:相邻两家不同时收信,不连续三家都没信

a(3): 最后一家收到信 · 2

b(3): 最后一家没收到信 · 2

a(3) = b(2) = 2b(3) = a(2) + a(1) = 1 + 1 = 2n = 3 时的总数:a(3) + b(3) = 4

虚线框的列是初始值,要自己数出来。描边的格子是所选列的来源。

送信:相邻两家不同时收信,不连续三家都没信。a(3) = b(2) = 2。b(3) = a(2) + a(1) = 1 + 1 = 2。n = 3 时的总数:a(3) + b(3) = 4。

  1. 1

    设 a(n)a(n) 为 nn 户人家中最后一户收到信的送信方式数,b(n)b(n) 为最后一户没收到信的方式数。如果最后一户收到信,它前面那户必须是什么情况?

    先预测一下:
    点击一个选项,或输入它的字母(A–E)。

竞赛角真实竞赛题

习题 10.5.3(补充题)

AIME

每个字母都是 A 或 B 的 10 个字母的字符串共有 210=10242^{10} = 1024 个。求其中没有超过 3 个相同字母连在一起的字符串的个数。

A/B 字符串,相同字母至多连续 3 个。状态 f(n): 以 A 结尾; g(n): 以 B 结尾。n = 6 时共有 48 个 A/B 字符串。

n4

A/B 字符串,相同字母至多连续 3 个

f(4): 以 A 结尾 · 7

  • BBBA
  • BBAA
  • BABA
  • BAAA
  • ABBA
  • ABAA
  • AABA

g(4): 以 B 结尾 · 7

  • BBAB
  • BABB
  • BAAB
  • ABBB
  • ABAB
  • AABB
  • AAAB
f(4) = g(3) + g(2) + g(1) = 4 + 2 + 1 = 7g(4) = f(3) + f(2) + f(1) = 4 + 2 + 1 = 7n = 4 时的总数:f(4) + g(4) = 14

虚线框的列是初始值,要自己数出来。描边的格子是所选列的来源。

A/B 字符串,相同字母至多连续 3 个。f(4) = g(3) + g(2) + g(1) = 4 + 2 + 1 = 7。g(4) = f(3) + f(2) + f(1) = 4 + 2 + 1 = 7。n = 4 时的总数:f(4) + g(4) = 14。

习题 10.5.4(补充题)

AMC 12

对每个正整数 nn,设 S(n)S(n) 为只由字母 AA 和 BB 组成、长度为 nn 的序列的个数,要求连续的 AA 不超过三个,连续的 BB 也不超过三个。S(2015)S(2015) 除以 12 的余数是多少?

A/B 字符串,相同字母至多连续 3 个。状态 f(n): 以 A 结尾; g(n): 以 B 结尾。n = 16 时共有 2 个 A/B 字符串(mod 12)。

模12
n4

A/B 字符串,相同字母至多连续 3 个

f(4) = g(3) + g(2) + g(1) ≡ 4 + 2 + 1 ≡ 7g(4) = f(3) + f(2) + f(1) ≡ 4 + 2 + 1 ≡ 7n = 4 时的总数:f(4) + g(4) ≡ 2(mod 12)

模 12 时,总数每 52 列重复一次。

虚线框的列是初始值,要自己数出来。描边的格子是所选列的来源。

A/B 字符串,相同字母至多连续 3 个。f(4) = g(3) + g(2) + g(1) ≡ 4 + 2 + 1 ≡ 7。g(4) = f(3) + f(2) + f(1) ≡ 4 + 2 + 1 ≡ 7。n = 4 时的总数:f(4) + g(4) ≡ 2(mod 12)。

过关检测(第 10.4 节)

3 题中答对 2 题即可掌握本节。每题只有一次机会,没有提示。
1

由 6 个 0 和 1 组成、没有两个 1 相邻的字符串有多少个?

2

在送信问题中(相邻两户不能都收到信,也不能连续三户都没收到信),a(n)=b(n−1)a(n) = b(n-1),b(n)=a(n−1)+a(n−2)b(n) = a(n-1) + a(n-2)。如果 a(7)=5a(7) = 5,b(7)=7b(7) = 7,a(6)=4a(6) = 4,那么 b(8)b(8) 是多少?

3

6 户人家有多少种送信方式(相邻两户不能都收到信,也不能连续三户都没收到信)?

10.5

练习题

在本节中,你将能够 在博弈、圆环和不断缩小的三角形问题中运用递推。

三道挑战题:一个拿砖游戏、一个涂色的圆环、一个不断缩小的三角形。每一道里都藏着一个递推。

想在一页上看到本章的所有题目?打开习题集。

竞赛角真实竞赛题

习题 10.5.2

AMC 10/12挑战

这道题在书中还以 3.3.14 的编号出现。

Arjun 和 Beth 玩一个游戏:两人轮流从若干堵砖墙中的某一堵“墙”上拿走一块砖或两块相邻的砖,拿走后留下的空隙可能产生新的墙。每堵墙都只有一块砖高。例如,大小为 44 和 22 的一组墙,走一步后可以变成下面任意一种:(3,2)(3, 2)、(2,1,2)(2, 1, 2)、(4)(4)、(4,1)(4, 1)、(2,2)(2, 2) 或 (1,1,2)(1, 1, 2)。

Arjun 先走,拿走最后一块砖的玩家获胜。对于下面哪一种初始局面,Beth 有必胜策略?

点击一个选项,或输入它的字母(A–E)。

习题 10.5.6(补充题)

AIME挑战

下图是一个由六个小区域组成的圆环,你要把它画在墙上。你有四种颜色的颜料,每个区域涂成一种纯色。如果相邻的两个区域不能涂相同的颜色,求涂色方法的种数。

习题 10.5.7(补充题)

AMC 12挑战

设 △A0B0C0\triangle A_0B_0C_0 是一个三个角恰好为 59.999∘59.999^\circ、60∘60^\circ 和 60.001∘60.001^\circ 的三角形。对每个正整数 nn,定义 AnA_n 为从 An−1A_{n-1} 向直线 Bn−1Cn−1B_{n-1}C_{n-1} 所作的高的垂足。类似地,定义 BnB_n 为从 Bn−1B_{n-1} 向直线 An−1Cn−1A_{n-1}C_{n-1} 所作的高的垂足,CnC_n 为从 Cn−1C_{n-1} 向直线 An−1Bn−1A_{n-1}B_{n-1} 所作的高的垂足。使 △AnBnCn\triangle A_nB_nC_n 为钝角三角形的最小正整数 nn 是多少?