加法原理定义:做一件事有n种方法,第一类有 m 1 m_1 m1种方法,第二类有 m 2 m_2 m2种方法,…第n类有 m n m_n mn种方法,完成这件事共有 m 1 m_1 m1+ m 2 m_2 m2+…+ m n m_n mn种不同的方法。
乘法原理定义:如果完成一个事件可以分解为n个独立的步骤,每个步骤均有m种实现方式,那么,完成这一事件总共有mxn种方法。
分类问题用加法,分步问题用乘法。
定义 1.1 (阶乘) 阶乘(factorial),即阶乘式的乘法,定义如下:
n
!
=
n
×
(
n
−
1
)
×
(
n
−
2
)
×
.
.
.
×
3
×
2
×
1
n! = n\times(n-1)\times(n-2)\times...\times3\times2\times1
n!=n×(n−1)×(n−2)×...×3×2×1
规定 0! = 1.
有时可能遇到双阶乘(double factorial),其定义为
n
!
!
=
{
n
×
(
n
−
2
)
×
.
.
.
×
4
×
2
,
n
为
偶
数
;
n
×
(
n
−
2
)
×
.
.
.
×
3
×
1
,
n
为
奇
数
n!! = \begin{cases} n\times(n-2)\times...\times4\times2, n为偶数; \\ n\times(n-2)\times...\times3\times1, n为奇数\\ \end{cases}
n!!={n×(n−2)×...×4×2,n为偶数;n×(n−2)×...×3×1,n为奇数
仍规定0!! = 1
在R语言中,计算阶乘的命令为factorial()、例如,求10!的命令为
factorial(10)
[1] 3628800
定义1.2 (排列) 排列(permutation)是指从n个不同元素中无放回(without replacement)地抽取r(r
≤
\leq
≤n)个元素所排成的一列(考虑元素的先后次序)此排列的总数为
n
P
r
_nP_r
nPr,又记为
P
n
r
P^r_n
Pnr或
A
n
r
A^r_n
Anr(A是排列的另一英文Arrangement的首字母),排列的计算方式如下:
n
P
r
=
n
!
(
n
−
r
)
!
_nP_r = \frac{n!}{(n-r)!}
nPr=(n−r)!n!
特别地,有
n
P
n
=
n
!
_nP_n = n!
nPn=n!.
定义1.3(组合) 组合(combination)是指从n个不同 的元素中无放回地抽取r(r
≤
\leq
≤n)个元素并成一组(不考虑元素的先后次序),记为
n
C
r
_nC_r
nCr或
C
n
r
C^r_n
Cnr或
(
r
n
)
(^n_r)
(rn)。或者说,组合数其实考虑的是n个不同元素中无放回地抽取r(r
≤
\leq
≤n)个元素,可以构成的不同子集的个数,组合的计算方式如下:
n
C
r
=
n
P
r
r
!
=
n
!
(
n
−
r
)
!
r
!
_nC_r = \frac{_nP_r}{r!} = \frac{n!}{(n-r)!r!}
nCr=r!nPr=(n−r)!r!n!
特别地,规定
n
C
0
=
n
C
n
=
1
_nC_0 = _nC_n = 1
nC0=nCn=1.
R中计算组合的命令为choose(n,k),给出的是 n C K _nC_K nCK的值,例如,求 10 C 5 _{10}C_5 10C5的命令为
choose(10, 5)
[1] 252
计算排列的命令,如 10 P 5 _{10}P_5 10P5时,可利用关系式 10 P 5 = 10 C 5 × 5 ! _{10}P_5 = _{10}C_5\times5! 10P5=10C5×5!,输入如下命令:
choose(10, 5) * factorial(5)
[1] 30240