很多数学问题并不是先问“结果是多少”,而是先问“可能情况有多少种”。例如,从若干对象中选择一部分、安排顺序、计算样本空间大小、估计事件发生概率,都离不开计数方法。
计数看似只是“数一数”,但真正重要的是分析问题结构:是分类完成,还是分步完成;是否关心顺序;是否存在重复计数。排列、组合和二项式系数,正是处理这些问题的基本工具。
说明:本文主要讨论最基础的有限计数问题。文中的排列、组合公式默认对象互不相同,并且每个对象最多使用一次;更复杂的重复选择、重复元素排列和约束计数,可以在后续系列文章中扩展。
一、加法原理与乘法原理
图 1:加法原理与乘法原理
1、分类完成一件事:加法原理
有些问题可以分成几类情况来完成,并且每次只会属于其中一类。
例如,去一个地方可以选择坐公交,也可以选择坐地铁。假设:
公交有 3 条路线;
地铁有 2 条路线。
如果一次出行只选择其中一种方式,那么总选择数为:
这里的关键是:公交和地铁是两类互不重叠的选择。完成这件事时,只需要从其中一类中选一种。这类问题适合使用“加法原理”。
加法原理(Addition Principle)用于“分类完成一件事”。
如果完成一件事有几类互不重叠的方法,第一类有 m 种方法,第二类有 n 种方法,那么总方法数为:
更一般地,如果有 k 类互不重叠的方法,数量分别为:
则总数为:
加法原理强调的是“或者”:选择第一类,或者选择第二类,或者选择其他类别。
使用加法原理时,要特别注意不同类别之间不能重复。如果同一种情况被归入两类,就会重复计数。
2、分步完成一件事:乘法原理
有些问题需要分几步完成,并且每一步都要做。
例如,选择一套衣服,需要先选上衣,再选裤子。假设:
上衣有 3 件;
裤子有 2 条。
每一件上衣都可以搭配任意一条裤子,所以总搭配数为:
这里的关键是:完成这件事需要两个步骤,而且每一步的选择都要参与最终结果。这类问题适合使用“乘法原理”。
乘法原理(Multiplication Principle)用于“分步完成一件事”。
如果完成一件事需要两步,第一步有 m 种选择,第二步有 n 种选择,那么总方法数为:
更一般地,如果完成一件事需要 k 步,每一步的选择数分别为:
则总数为:
乘法原理强调的是“并且”:先完成第一步,并且完成第二步,并且继续完成后续步骤。如果后一步的选择数会随着前一步的选择而变化,就不能简单套用固定乘积,而要根据不同情况分别计算。
很多排列问题,本质上都是乘法原理的连续使用。
二、排列
1、有顺序的选择
排列(Permutation)指从若干对象中选出一些,并且关心它们的顺序。
例如,从 A、B、C 三个字母中选出两个排列,可能结果包括:
这里 AB 和 BA 被看作不同结果,因为顺序不同。
因此,判断一个问题是不是排列,关键要问:结果中顺序是否重要?
如果顺序不同就表示不同结果,那么通常是排列问题。
2、全排列
全排列指 n 个不同对象的全部排列,也就是把所有对象都取出,并按一定顺序排列。
例如,A、B、C 三个字母的全排列有:
一共有 6 种。
用乘法原理解释:
第一个位置有 3 种选择;
第二个位置剩下 2 种选择;
第三个位置剩下 1 种选择。
所以总数为:
一般地,n 个不同对象的全排列数为:
其中,n! 读作 n 的阶乘,表示:
例如:
特别地,规定:
这个规定在组合公式和二项式展开中非常有用。
3、部分排列
部分排列指的是从 n 个不同对象中选出 k 个,并按顺序排列。
例如,从 A、B、C、D 四个字母中选出 2 个排成一列。
第一个位置有 4 种选择,第二个位置剩下 3 种选择,所以总数为:
一般地,从 n 个不同对象中选出 k 个进行排列,排列数通常记作:
读作“从 n 个中取 k 个的排列数”。它的计算公式为:
也可以写成:
一般要求 k 为整数,并且 0 ≤ k ≤ n。
在一些英文教材或程序库中,排列数也常写作:
或:
4、排列公式的含义
排列公式是乘法原理的结果。
说明:本文中的排列公式默认讨论的是,n 个对象互不相同,并且每个对象最多使用一次。如果允许重复选择,例如密码每一位都可以重复使用数字,那么计数方法会不同,需要重新分析每一步的选择数。
从 n 个对象中选出 k 个排列:
第 1 个位置有 n 种选择;
第 2 个位置有 n - 1 种选择;
第 3 个位置有 n - 2 种选择;
第 k 个位置有 n - k + 1 种选择。
所以总数为:
这正是排列数公式:
排列问题的核心是:选出的对象不仅重要,它们的位置顺序也重要。
三、组合
图 2:排列与组合的核心区别
说明:本文中的组合默认指从 n 个互不相同的对象中选出 k 个,并且每个对象最多选一次。
1、无顺序的选择
组合(Combination)指的是从若干对象中选出一些,但不关心顺序。
例如,从 A、B、C 三个字母中选出两个。
可能结果是:
这里 AB 和 BA 表示同一组选法,因为选到的对象一样,只是写的顺序不同。
因此,判断一个问题是不是组合,关键要问:只关心选了哪些对象,还是也关心它们的顺序?
如果只关心选到哪些对象,通常是组合问题。
2、组合数
从 n 个不同对象中选出 k 个,不考虑顺序,称为组合数,通常记作:
读作“从 n 个中取 k 个的组合数”。
在很多数学教材和概率统计教材中,组合数也常写作:
读作“n 选 k”。
二者表示同一个数:
例如:
或:
都表示从 4 个对象中选出 2 个,不考虑顺序。
如果对象为 A、B、C、D,则共有:
一共 6 种。
所以:
3、组合数公式与重复去除
组合数公式为:
一般要求 k 为整数,并且 0 ≤ k ≤ n。
组合数公式可以从排列数理解。
先从 n 个对象中选出 k 个并排序,有:
种排列。
但是,如果只关心选出的 k 个对象,不关心它们内部顺序,那么同一组对象会被重复计算 k! 次。
例如,选出 A、B、C 三个对象时:
这些排列顺序不同,但对应同一个组合。因此要除以 k!,于是得到:
也就是:
组合数公式的核心是:先按顺序数出来,再把重复顺序去掉。
4、组合与排列的关系
排列和组合之间有非常清楚的关系。
从 n 个对象中选 k 个并排列,等价于:
先从 n 个对象中选出 k 个;
再把这 k 个对象进行全排列。
所以:
反过来:
也可以写成:
这说明组合是“不考虑顺序的选择”,排列是“考虑顺序的选择”。
如果一个问题容易混淆,可以先问一句:换个顺序,结果还算不算不同?
如果算不同,就是排列;如果不算不同,就是组合。
四、二项式系数
1、二项式展开
二项式(Binomial)是由两项组成的代数式,例如:
二项式展开研究的是:
展开后会出现怎样的项(Term)和系数(Coefficient)。
例如:
再如:
这些系数:
和:
都与组合数有关。
2、组合数与展开系数
当 n 为非负整数时,二项式定理(Binomial Theorem)可以写成:
其中:
表示展开式中对应项的系数,本质上是一个组合数。
为什么会出现组合数?
因为:
可以看成 n 个:
相乘。
要得到一项:
就需要在 n 个括号中选择 k 个括号取 y,剩下 n - k 个括号取 x。
从 n 个括号中选 k 个取 y,有:
种方法。所以展开系数正是组合数。
以:
为例,按照二项式定理,有:
当 k = 0 时,对应项为:
其中:
所以:
其余几项可以直接写出:
因此,展开式对应项的系数:
分别对应:
也就是:
这说明,二项式展开中的系数,本质上是在数“从 n 个括号中选择多少个括号取 y”的方法数。
3、杨辉三角
杨辉三角(Pascal's Triangle)可以把二项式系数按层排列。
前几层为:
每一行对应一个二项式展开的系数。
图 3:杨辉三角与二项式系数
例如:
对应系数正是:
也就是:
杨辉三角中的每个内部数字,都等于它上方两个数字之和。
例如:
这体现了组合数之间的递推关系。
4、计数结构中的对称性
组合数具有对称性:
也可以写成:
它的含义很直观:从 n 个对象中选 k 个,等价于决定哪 n - k 个不选。
例如,从 5 个对象中选 2 个:
从 5 个对象中选出 3 个作为“不选的对象”,也有 10 种:
因为“选中 2 个”和“排除 3 个”描述的是同一件事的两个角度。
这种对称性是组合计数中的重要结构,也会出现在概率、统计和二项分布中。
五、排列组合在概率中的位置
排列、组合和概率的关系非常密切。
在许多概率问题中,真正困难的地方不是概率公式本身,而是如何数清楚:一共有多少种可能结果?事件包含多少种结果?
如果所有基本结果等可能,那么事件的概率就可以写成:
事 件 包 含 的 结 果 数 所 有 可 能 结 果 数
这里,分母通常来自样本空间大小,分子来自事件包含的结果数。排列、组合和乘法原理,就是用来计算这些结果数的工具。
1、用乘法原理计算样本空间大小
样本空间(Sample Space)表示所有可能结果的集合,事件(Event)是样本空间中的一部分结果。
图 4:样本空间、事件结果数与概率
例如,掷两枚骰子。第一枚骰子有 6 种结果,第二枚骰子也有 6 种结果。根据乘法原理,所有可能结果数为:
这说明样本空间中一共有 36 个基本结果。
如果事件是“点数和为 7”,那么符合条件的结果为:
一共有 6 个结果。
因此:
点 数 和 为
这个例子主要使用的是乘法原理:先数出所有可能结果,再数出事件包含的结果。
2、用组合数计算无顺序选择的概率
有些概率问题只关心“选到了哪些对象”,不关心顺序,这时通常要使用组合数。
例如,从 5 个不同对象 A、B、C、D、E 中随机选 2 个,且不考虑顺序,所有选法数为:
这就是样本空间大小。
如果事件是“选出的 2 个对象中包含指定对象 A”,那么只需要再从剩下 4 个对象中选 1 个,与对象 A 组成一组。
事件包含的结果数为:
因此:
选 中
这个例子说明:当问题不关心顺序时,分母和分子都应该用组合数来计数。
3、用排列数计算有顺序结果的概率
有些概率问题不仅关心选中了哪些对象,还关心顺序,这时通常要使用排列数。
例如,从 5 名选手中排出前三名。因为第一名、第二名、第三名的顺序不同,结果就不同,所以这是排列问题。
所有可能排名数为:
如果事件 A 表示“某位指定选手获得第一名”,那么第一名已经固定,剩下第二名和第三名需要从其余 4 名选手中选出并排序。
事件包含的结果数为:
因此:
指 定 选 手 获 得 第 一 名
这个例子说明:当结果有位置顺序时,分母和分子都应该用排列数来计数。
4、计数口径必须一致
在概率问题中,最容易出错的地方是分子和分母使用了不同的计数口径。
如果样本空间按“有顺序结果”来计数,事件结果也要按有顺序结果来计数。
如果样本空间按“无顺序选择”来计数,事件结果也要按无顺序选择来计数。
例如,从 A、B、C 三个对象中选 2 个。如果不考虑顺序,正确结果是:
共有 3 种。
如果明确不考虑顺序,却把 AB 和 BA 当作两个不同结果,就会把无序选择误写成有序排列。这样容易造成分子和分母的计数口径不一致,从而影响概率判断。
因此,在概率问题中,先判断“是否关心顺序”,再决定使用排列数还是组合数,比直接套公式更重要。
六、Python 示例:计算排列数、组合数与简单模拟
1、使用 Python 计算阶乘
Python 的 math 模块提供了阶乘函数。
这对应:
也可以自己写一个简单循环计算阶乘:
2、计算组合数
在较新的 Python 版本中,可以直接使用:
这对应:
也可以用公式计算:
这里使用整数除法 //,因为组合数的结果一定是整数。
如果要计算排列数:
可以使用:
它表示从 5 个对象中选 2 个并考虑顺序的结果数。
3、模拟简单抽取问题
下面模拟“从 5 个对象中随机选 2 个”的问题。
理论上,从 5 个对象中选 2 个共有 10 种组合。
如果模拟次数足够多,通常会观察到全部 10 种不同组合;如果模拟次数较少,可能暂时没有覆盖所有组合。
随着模拟次数增加,各组合出现的相对频率通常会逐渐接近理论概率,也就是接近 1/10。
这个例子说明:在组合问题中,如果顺序不重要,就要把 AB 和 BA 看作同一种结果。
七、常见误解
1、分不清排列和组合
排列和组合比较容易混淆。判断方法很简单:看顺序是否重要。
如果顺序不同,结果就不同,是排列。
如果顺序不同,但选到的对象相同,结果就相同,是组合。
例如,比赛前三名有顺序,是排列;从班级中选 3 名代表没有顺序,是组合。
2、不理解为什么组合要去掉顺序
组合公式中除以 k!,是为了去掉同一组对象内部的不同排列顺序。
例如,A、B、C 三个对象组成一组时:
在排列中算 6 种,在组合中只算 1 种。
因此,从排列数变成组合数时,需要除以 k!。
3、机械使用公式,不分析问题结构
计数问题不能只看关键词。
看到“选”不一定就是组合;看到“排”通常与顺序有关,但也要看具体要求。
正确做法是先分析结构:是分类,还是分步?是否关心顺序?是否允许重复?是否存在重复计数?
先判断问题结构,再选择公式,才不容易出错。
4、忽视分类和分步的区别
加法原理用于分类,乘法原理用于分步。
如果是“从几类方案中选一种”,通常用加法。
如果是“完成一件事需要连续几个步骤”,通常用乘法。
例如,选择交通方式属于分类;选择账号密码的不同位置属于分步。
把分类问题误当分步,或把分步问题误当分类,都会导致计数错误。
5、忽视复杂计数问题中的分类讨论
有些计数问题不能直接套一个公式解决,而需要先把情况分清楚。
例如,从若干人中选代表时,如果没有额外条件,可能直接使用组合数;但如果要求“至少有一名女生”“不能同时选某两个人”“必须包含某个成员”,问题就不再是单纯的普通组合。
这时可以先进行分类讨论,或先计算总数再排除不符合条件的情况。例如,“至少有一名女生”可以按选 1 名、2 名、3 名女生分情况计算;“不能同时选 A 和 B”可以先算所有选法,再减去同时包含 A 和 B 的选法。
分类讨论时要注意两点:第一,不同类别之间不能重叠,否则会重复计数;第二,所有类别合在一起要覆盖完整情况,否则会遗漏结果。
因此,遇到复杂计数问题时,不要急着套排列或组合公式,而应先判断:有没有附加条件?能否分成互不重叠的情况?每一类内部是排列还是组合?最后是用加法合并,还是用乘法分步?
小结
计数方法的核心是分析问题结构:分类用加法,分步用乘法;关心顺序用排列,不关心顺序用组合。二项式系数来自组合数,概率中的样本空间大小和事件结果数也依赖计数。理解这些关系,有助于在随机问题中正确判断分子、分母和计数口径。
“点赞有美意,赞赏是鼓励”
热门跟贴