cn2 排列组合公式实际上没那么玄乎,它更像是一条手写的速记笔记。大量人一上来就记“分步乘法原理”、“分类加法原理”,感觉像是在背答题模板,结局背了也记不住。
实际上核心就一句话:想把它变成密码,得先找到“钥匙”。钥匙就是“先分后选”要么“先选后分”的逻辑,你只需求记住这两个动作,剩下的就是组合公式的硬控。 起初,得搞清楚两件事:样本空间是啥,还有事件之间的关系。样本空间,说白了就是所有可能结局的总数。
比如你想从 5 个不同的苹果里随意拿两个,总的拿法肯定不止一种,一个一个拿(1、2)、(1、3)、(1、4)、(1、5)、(2、3)……直到最终(4、5),一共是 10 种。
这就是样本空间的大小,也就是分母。 接下来看分子。分子代表的是你真正想要的那一种特定结局的数量。
这时候就要看这两个苹果是如何“组队”的。 第一种情况是“先分后选”。
比如你要从 3 组人里选 2 个人,其中 1 个组长,1 个组员。
这就得先选组长,选法有 3 种。组长选了之后,再选组员,剩下的 2 个人里任意一个都能够,有 2 种方式。
故此这种组合数就是 3 乘以 2,等于 6 种。
你看,这就是分步乘法原理的直接体现:搞定一件事,需求分 n 个步骤,且每一步都要做完才能算事,那么总的结局数就是步骤中每一步结局数的乘积。 第二种情况是“先选后分”。
比如你要从 2 个男性和 3 个女性里选 2 个人,且要求起码有一个女生。
这时候,要是先选人,你一共可选 5 个人(M1, M2, F1, F2, F3)。选法显然有 5 种。但每种选人方式里,能组成“起码一个女生”的排法不止一种。
比如选了 M1 和 M2,那就 0 个女生,不算;选了 M1 和 F1,就有 1 个女生,算进去。
这时候就需求用分类加法原理:把知足条件的情况加起来。算出每种选人对应的女孩数,然后相加,再乘以总选人种数。 实际上这两个例子都指向同一个核心思想:事件要么是由“务必做完的步骤”组成的,要么是由“选完才拍板算不算”的。
记住这个本质,公式自然就出来了。 再来看一个更直观的例子。假设你要买两瓶可乐,有 4 种口味,每瓶都要买。
这时候就是单纯的乘法原理。
第一瓶选 4 种可能,第二瓶也选 4 种可能,总共就是 4 × 4 = 16 种买法。
这里关键是每一瓶的口味选择都是独立的,互不干扰。 但要是题目略微变态点,比如你要选 3 瓶可乐,且务必包含“某一特定口味”。
这时候就不能好办乘了。你能够先算出一共有 4 种口味可选,然后从中排除掉“没选特定口味”的情况。
要么换个思路,固定第一瓶是特定口味,剩下两瓶从剩下的 3 种里选,就是 3 × 3 = 9 种。把这两局部加起来,就是 9 加上固定第一瓶剩下的情况,最终凑齐总数。
这里面实际上藏着“排除法”和“固定法”的变体,但本质上还是基于事件构成的拆解。 在实际操作中,大量人好办犯的毛病就是把乘法原理和加法原理搞混了。
比如“起码有一个”的难题,直接套乘法公式是错的,出于“有一个女生”和“有两个女生”是两个独立的事件,不能直接乘法。
这时候务必用分类加法:把“只有一个女生”、“有两个女生”、“有三个女生”的情况分别算出来,然后加起来。
这就是典型的分类加法原理:要做一件事,能够分成若干类,每一类内部互不重叠,那么总的结局数就是各类结局数的和。 再看组合数公式本身,C(n, k) = n! / [k! (n - k)!]。
这个公式看起来挺复杂,但实际上逻辑挺好办。C(n, k) 代表从 n 个不同元素里选出 k 个元素的组合方式总数。n! 是所有数的乘积,k! 和 (n-k)! 分别代表选出的 k 个元素和剩下的 n-k 个元素的排列方式总数。之故此除以它们,是出于组合不寻思顺序。
比如从 {A, B} 里选 {A},这是一件事。但从 {A, B} 里选 {B},也是一件事。
这两种选法和排列方式数一样,分子里多了 (n-k)!,故此一除就抵消了,剩下的是纯粹的选法数。 值得注意的是,组合数公式别看像个小公式,但推导过程实际上挺繁琐,值得体会。它在题目中主要作为中间步骤出现,计算具体的大数时,往往不撇脱直接开根号要么用计算器算阶乘,这时候就需求用到近似公式要么递推数列。
比如计算 C(17, 16) 时,C(17, 16) = 17 × 16 / (17 × 16) = 1,这种好办的时候可能直接用乘法原理就能想到 C(17, 16) 等于 17 种选法。但要是是 C(30, 10),那就要真正用公式了,这时候计算量就挺大了。 最终总结一下,cn2 排列组合公式在 Python 里实际上不需求写那些繁琐的循环和递归。
只要理解了“分步乘法”和“分类加法”的本质,代码里就只需求几行好办的逻辑。
比如统计某一群人的性别分布,写 Python 脚本时,先算出总人数作为分母,再遍历每个人是否归于目标组去累加分子,最终输出结局。
这种思维方式比死记硬背公式要管用得多。 实际上数学这东西,越往后看越认定好办。大量在高中就被吓退的难题,到了大学数学分析里,又找到了新的解法。
比如那会儿不会微积分就解不动的复杂概率难题,有了随机变量和期望的概念,瞬间变得清楚起来。排列组合就是其中的一局部,它教会我们在面对复杂系统的多样性时,不要试图一次搞定,而要把它拆解成一个个可执行的步骤。
只要把“分”与“选”的关系理顺,剩下的就是数字的运算了。 故此说,理解公式的底层逻辑,比记住公式本身更关键。当你真正读懂了“分步乘法原理”和“分类加法原理”在排列组合中的实际应用,你会发现,那些看似枯燥的数学符号,密码实际上早就在逻辑里了。