← 排列组合 · 从计数原理到 P(n,k) 与 C(n,k) / 排列 P(n, k):有序地取 k 个 待审核 2 / 10
permutation · P(n, k) = n! / (n−k)!

排列 P(n, k):有序地取 k 个

n互不相同的元素里取出 k排成一列次序算数——同样三个字母,ABCCBA 是两种不同的排列。这样的方案数记作 排列数 P(n, k)(也写作 AknA^n_knPk)。它是乘法原理最直接的应用:逐格填,每填一格,可选的元素就少一个。

1 · 填空位:每格的选法数逐格收缩

P(n, k) = n·(n−1)···(n−k+1)

把「取 k 个排成一列」想成依次填 k 个空位:第一格从全部 n 个里挑,有 n 种;挑走一个后,第二格只剩 n1n-1 种;……到第 k 格剩 nk+1n-k+1 种。按乘法原理,总数是这 k 个数相乘,即 P(n,k)=n!/(nk)!P(n, k) = n! / (n-k)!。拖动 nk,看每格标注的可选数如何变化。

2 · 把它们逐个列出来

enumerate · 全部排列

取前 n 个大写字母 A,B,C,A, B, C, \dots 作元素,下面枚举出有序取 k 个全部 P(n, k) 个排列。留意 ABBA 各占一席——这正是「次序算数」。当 k = n 时,取的是全体元素的一个排列,方案数就是 n!(全排列)。

排列数与「怎样把它们逐个生成出来」是两个问题:本页只数个数,而按字典序求下一个排列、用回溯铺出选择树、乃至给每个排列编号的康托展开,见算法系列 排列生成

3 · 相关链接