c++递归 n个人里选k个人的排列组合
这是组合数递推公式:
C(n,k)=C(n−1,k−1)+C(n−1,k)C(n, k) = C(n-1, k-1) + C(n-1, k)
这个公式的来源可以从组合意义上理解,也可以从杨辉三角或归纳法来推导。
🔍 组合意义解释(最常用的推导)
我们要从 nn 个人里选 kk 个人,有两种情况:
假设第 nn 个人叫 Alice,其他 n−1n-1 个人叫 Others。
-
情况 1:选了 Alice
那么剩下还需要从 Others 中选 k−1k-1 个,方案数是 C(n−1,k−1) -
情况 2:没选 Alice
那么需要从 Others 中选 kk 个,方案数是 C(n−1,k)
总方案数就是两种情况之和:
C(n,k)=C(n−1,k−1)+C(n−1,k)
📐 举个例子:C(5,2)C(5, 2)
从 5 个人中选 2 人:
-
包含第 5 人的组合:从前 4 个中选 1 人 → C(4,1)=4C(4, 1) = 4
-
不包含第 5 人的组合:从前 4 个中选 2 人 → C(4,2)=6C(4, 2) = 6
所以:
C(5,2)=4+6=10C(5, 2) = 4 + 6 = 10
🔁 对应到杨辉三角
这个公式就是杨辉三角(Pascal's Triangle)的构造规则:
每个位置的值是左上角加右上角:
1111211331\begin{align*} & & & & 1 \\ & & & 1 & & 1 \\ & & 1 & & 2 & & 1 \\ & 1 & & 3 & & 3 & & 1 \\ \end{align*}
每个数字都是它上面两个数字之和:
C(n,k)=C(n−1,k−1)+C(n−1,k)C(n, k) = C(n-1, k-1) + C(n-1, k)
如果你喜欢代数推导我也可以补充。是否要我从二项式系数公式角度推一遍?