1.排列
代码如下:
public static long permutation(int n, int m) {
long res = 1l;
for(; m > 0; m --) {
res *= n;
n --;
}
return res;
}
2.组合
并且规定:0!= 1。
C(3,0) = 1。
2.1通过排列的方式求组合
代码如下:
public static long comb(int n, int m) {
return permutation(n, m)/permutation(m, m);
}
2.2通过C(n,m-1)求C(n,m)
A(n,m-1),最后一个因式是(n-m+2),A(n,m)最后一个因式是(n-m+1),倒数第二个因式为(n-m+2),而m ! = m * (m - 1) !。
所以C(n,m) = C(n,m-1) * (n - m + 1) / m 。
代码如下:
public static int combination(int n, int m) {
m = n-m < m ? n-m : m;
int res = 1;
for(int k = 1; k <= m; k ++) {
res = ((n-k+1)*res)/k;
}
return res;
}
代码中有一处优化,即为n-m与m比较取较小值,因为组合的相等性,即C(n,m) = C(n,n-m),取较小值,减少运算次数。