排列(Arrangement)和组合(Conbination)在数学及其他相关领域中有着重要的应用。在python中,通过定义排列、组合的函数,能够计算出排列数或组合数,进而提高工作效率。
I - 了解排列与组合*
此处是对高中数学相关内容的总结,python的实现方法请往下看~
通过查阅资料,作者得到了更易于理解的定义。在了解排列和组合之前,请先了解:加法原理和乘法原理。这里用例题来解释:
加法原理与乘法原理
- 加法原理
如图所示,在A地的人想去B地,面前有三条路可走:一号,二号,三号,问:此人有多少种走法?
很简单,一共有三种走法,第一种:走一号路;第二种:走二号路;第三种:走三号路。
- 乘法原理
将问题变得复杂些,如图所示,A地的人要先经过B地,最后再到达C地,请问:此人有多少种走法?
由分析可知,假如人走一号路到达B后,他就面临着两个选择——走四号路或者走五号路。
以此类推,如果此人走二号路,同样会面临两种选择,三号路亦然。因此此人有2*3=6种选择:
—— 一和四、一和五、二和四、二和五、三和四、三和五
排列与组合
规定m,n为正整数,且m>=n。假定有m个元素,从这些元素中随机取出n个元素,并将这n个元素随机排列,所有排列种类的个数,叫做排列数。表示:
A
m
n
A_{m}^{n}
Amn
规定m,n为正整数,且m>=n。假定有m个元素,从中随机取出n个元素组成一个集合,组成的所有集合的个数叫做组合数。表示:
C
m
n
C_{m}^{n}
Cmn
在介绍两者的计算公式之前,还要引入一种运算——阶乘:
n
!
=
1
∗
2
∗
3
∗
.
.
.
∗
n
,
n
∈
N
+
n! = 1*2*3*...*n, n∈N^{+}
n!=1∗2∗3∗...∗n,n∈N+
计算公式:
A
m
n
=
m
(
m
−
1
)
(
m
−
2
)
.
.
.
(
m
−
n
+
1
)
=
m
!
(
m
−
n
)
!
A_{m}^{n} = m(m-1)(m-2)...(m-n+1)=\frac{m!}{(m-n)!}\quad
Amn=m(m−1)(m−2)...(m−n+1)=(m−n)!m!
C
m
n
=
A
m
n
m
!
=
m
!
(
m
−
n
)
!
n
!
C_{m}^{n} = \frac{A_{m}^{n}}{m!}\quad = \frac{m!}{(m-n)!n!}\quad
Cmn=m!Amn=(m−n)!n!m!
II - Python解决方案 - 套公式
在上文中,我们已经提及了相关的知识点及公式。那么计算就变得尤为简单了。我们要解决的是计算排列数和组合数,在此之前,我们还要定义一个阶乘函数,代码示例如下:
#在python中实现排列、组合运算 - 解决方案
#f(x)阶乘函数 A(m,n)排列 C(m,n)组合
#请确保输入的m,n均为正整数
#阶乘函数
def f(x):
tmp = 1
for i in range(1,x+1):
tmp *= i
return tmp
def A(m,n):
return int(f(m)/f(m-n))
def C(m,n):
return int(A(m,n)/f(n))