SOURCE

/**
 * 计算组合数
 * @param {number} n 
 * @param {number} m 
 * @return {number}
 */
var combination = (n, m) => {
    if (n == null || m == null) throw Error(' 参数缺少或不能为空')
    if (n < 0 || m < 0) throw Error(' The parameter passed in cannot be negative.')
    if (n === 0 || m === 0) return 1
    // 如果 n < m 则替换两个数的位置    
    if (n < m) [n, m] = [m, n];

    return factorial(n, m) / factorial(m);
};
 
/**
 * 计算阶乘
 * @param {number} n 
 * @param {number} m 
 * @return {number}
 */
var factorial = (n, m = n) => {
    if (!n) { return 0 }

    // 负数
    if (n < 0) {
        throw Error(' The parameter passed in cannot be negative.')
    }

    // 如果 n < m 则替换两个数的位置    
    if (n < m) [n, m] = [m, n];
    
    if (n <= 1 || m <= 0) return 1;
    
    if (m === 1) return n;
    else return (n * factorial(n - 1, m - 1)); 
}

// 阶乘验证可参考下面网址对比结果
// https://zh.numberempire.com/factorialcalculator.php 
console.log(factorial(5))

// 组合数验证可参考下面网址对比结果
// https://zh.numberempire.com/combinatorialcalculator.php 
console.log(combination(0,2))
console 命令行工具 X clear

                    
>
console