# 求排列数
/**
* Anm = n! / (n - m)!
* @param {number} n
* @param {number} m
*/
var arrangement = function (n, m) {
let result = 1
// n的阶乘除以n-m的阶乘 最终的结果就是 (n - 0) * (n - 1) * (n - 2) * ... * (n - m - 1)
// result *= (n - i) (0 <= i < m)
for (let i = 0; i < m; i++) {
result *= (n - i)
}
return result
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
2
3
4
5
6
7
8
9
10
11
12
13
14
# 求组合数
/**
* Cnm = Anm / m! = n! / m!*(n - m)!
* @param {number} n
* @param {number} m
*/
var combination = function (n, m) {
let result = 1;
for (let i = 0; i < m; i++) {
// i + 1 等价与m的阶乘
// n - i 等价于 n的阶乘
// n!/(n - m)! 最终的结果是n的阶乘只做到 n - m 因为从后面 分子分母就可以约掉
result *= (n - i) / (i + 1);
}
return result;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 卡特兰数
例:96.不同的二叉搜索树 (opens new window)
/**
* 通项公式:C0 = 1 Cn+1 = (2(2n + 1) / (n + 2)) * Cn
* @param {number} n 卡特兰数的第几项(n >= 0)
*/
var catalanNumber = function (n) {
let C = 1
for (let i = 0; i < n; i++) {
C = C * 2 * (2 * i + 1) / (i + 2)
}
return C
}
1
2
3
4
5
6
7
8
9
10
11
2
3
4
5
6
7
8
9
10
11
# 海伦公式
/**
* 已知三边长度求三角形面积
* S = (p(p-a)(p-b)(p-c)) ^ 1/2 其中 p = (a+b+c)/2 (半周长)
* @param {number} a
* @param {number} b
* @param {number} c
*/
var heron = function (a, b, c) {
const p = (a + b + c) / 2
return Math.sqrt(p * (p - a) * (p - b) * (p - c))
}
1
2
3
4
5
6
7
8
9
10
11
2
3
4
5
6
7
8
9
10
11