js实现阶乘
实现阶乘的几种方法
阶乘(Factorial)是指从1到该数的所有正整数相乘的积。例如,5的阶乘表示为5!,计算方式为5 × 4 × 3 × 2 × 1 = 120。以下是几种在JavaScript中实现阶乘的方法。
递归方法
递归是一种常见的阶乘实现方式,通过函数调用自身来解决问题。递归方法简洁直观,但需要注意递归深度可能导致栈溢出。

function factorialRecursive(n) {
if (n === 0 || n === 1) {
return 1;
}
return n * factorialRecursive(n - 1);
}
console.log(factorialRecursive(5)); // 输出: 120
迭代方法
迭代方法通过循环结构实现阶乘计算,避免了递归的栈溢出问题,适合处理较大的数值。
function factorialIterative(n) {
let result = 1;
for (let i = 2; i <= n; i++) {
result *= i;
}
return result;
}
console.log(factorialIterative(5)); // 输出: 120
使用数组的reduce方法
利用数组的reduce方法可以简洁地实现阶乘计算,但需要先构建一个包含从1到n的数组。

function factorialReduce(n) {
return Array.from({ length: n }, (_, i) => i + 1)
.reduce((acc, val) => acc * val, 1);
}
console.log(factorialReduce(5)); // 输出: 120
尾递归优化
尾递归优化可以避免递归调用时的栈溢出问题,但需要JavaScript引擎支持尾调用优化(TCO)。
function factorialTailRecursive(n, acc = 1) {
if (n === 0 || n === 1) {
return acc;
}
return factorialTailRecursive(n - 1, acc * n);
}
console.log(factorialTailRecursive(5)); // 输出: 120
使用BigInt处理大数
当计算较大数的阶乘时,普通数值类型可能溢出,可以使用BigInt来处理大整数。
function factorialBigInt(n) {
let result = 1n;
for (let i = 2n; i <= BigInt(n); i++) {
result *= i;
}
return result;
}
console.log(factorialBigInt(20)); // 输出: 2432902008176640000n
注意事项
- 递归深度:递归方法在数值较大时可能导致栈溢出,建议使用迭代方法或尾递归优化。
- 数值范围:普通数值类型(
Number)在计算较大阶乘时会溢出,建议使用BigInt。 - 性能优化:对于高频调用的场景,可以预先计算并缓存结果以提高性能。






