排列组合
排列组合 #
可能出现的情况总数。
排列:是指从给定个数的元素中取出指定个数的元素进行排序。– n个中取m个,需要考虑排序:
n!/(n-m)!
组合:是指从给定个数的元素中仅仅取出指定个数的元素,不考虑排序。– n个中取m个,不考虑排序:
n!/m!*(n-m)!
例如 #
- 3个球里取1个,有多少种排列呢?根据公式有:
3*2*1/2*1 = 3
,跟直觉一致。组合呢?根据公式有:3*2*1/1*2*1 = 3
.
当取1个的时候,排列和组合是一样的,因为此时m! = 1
.
- 3个球里取2个,排列:
3*2*1/(3-2) = 6
; 组合:3*2*1/2*1*1 = 3
.
此时,排列数比组合数多。
如果用A、B、C分别表示3个球,则排列情况有:AB、AC、BC、BA、CA、CB
;组合情况有:AB、AC、BC
。
- 当n和m都很大时,需要借助计算机来计算:
package main
func factorial(n int) (s int) {
s = 1
for i := 1; i <= n; i++ {
s *= i
}
return
}
func main() {
s := factorial(10) / factorial(10-4)
println("10个取4个的排列", s) // 10个取4个的排列 5040
p := factorial(10) / factorial(10-4) * factorial(4)
println("10个取4个的组合", p) // 10个取4个的组合 120960
}