js 实现阶乘
递归实现
递归是计算阶乘最直观的方法之一。递归函数会不断调用自身,直到达到基本情况(通常是 n === 0 或 n === 1)。
function factorialRecursive(n) {
if (n === 0 || n === 1) {
return 1;
}
return n * factorialRecursive(n - 1);
}
循环实现
使用循环可以避免递归可能导致的堆栈溢出问题,尤其是在计算大数阶乘时。
function factorialLoop(n) {
let result = 1;
for (let i = 2; i <= n; i++) {
result *= i;
}
return result;
}
尾递归优化
尾递归是一种优化递归的方式,可以避免堆栈溢出。但需要注意的是,JavaScript 引擎不一定支持尾调用优化(TCO)。
function factorialTailRecursive(n, acc = 1) {
if (n === 0 || n === 1) {
return acc;
}
return factorialTailRecursive(n - 1, n * acc);
}
使用 BigInt 处理大数
JavaScript 的 Number 类型有精度限制,对于大数阶乘(如 n > 20),可以使用 BigInt 避免精度丢失。
function factorialBigInt(n) {
let result = 1n;
for (let i = 2n; i <= n; i++) {
result *= i;
}
return result;
}
性能比较
- 递归实现简洁但可能导致堆栈溢出。
- 循环实现性能较好,适合大多数场景。
- 尾递归优化在支持 TCO 的环境中表现优异。
BigInt适合处理大数阶乘,但会牺牲部分性能。







