js实现n的阶乘
递归方法实现阶乘
递归是计算阶乘最直观的方法,通过函数调用自身实现。
function factorial(n) {
if (n === 0 || n === 1) {
return 1;
}
return n * factorial(n - 1);
}
特点:代码简洁,但需注意栈溢出风险(如 n 过大时)。
循环方法实现阶乘
通过循环迭代计算,避免递归的潜在性能问题。
function factorial(n) {
let result = 1;
for (let i = 2; i <= n; i++) {
result *= i;
}
return result;
}
特点:性能更优,适合大数计算。
尾递归优化(ES6)
利用ES6的尾调用优化减少栈开销,需严格满足尾递归条件。
function factorial(n, acc = 1) {
if (n === 0 || n === 1) {
return acc;
}
return factorial(n - 1, n * acc);
}
注意:并非所有JavaScript引擎都支持尾调用优化。
使用BigInt处理大数阶乘
当 n 较大时(如 n > 20),普通数字类型会溢出,需使用 BigInt。
function factorial(n) {
let result = 1n; // BigInt类型
for (let i = 2n; i <= n; i++) {
result *= i;
}
return result;
}
// 调用时传入BigInt或普通数字(需转换)
console.log(factorial(20n)); // 输出: 2432902008176640000n
适用场景:需要计算极大阶乘时。
性能与边界条件
- 输入验证:处理负数或非整数输入(如抛出错误)。
- 缓存结果:频繁计算时可缓存已计算的结果提升性能。
根据需求选择合适的方法,常规场景推荐循环或尾递归,大数计算必须使用 BigInt。







