js实现n的阶乘
递归实现
递归是计算阶乘最直观的方法,利用函数调用自身的方式实现。
function factorialRecursive(n) {
if (n === 0 || n === 1) {
return 1;
}
return n * factorialRecursive(n - 1);
}
说明:
- 基线条件为
n === 0或n === 1,直接返回1。 - 递归调用
n * factorialRecursive(n - 1)逐步分解问题。
循环实现
通过循环(如 for 或 while)迭代计算阶乘,避免递归可能导致的栈溢出问题。

function factorialLoop(n) {
let result = 1;
for (let i = 2; i <= n; i++) {
result *= i;
}
return result;
}
说明:
- 初始化
result为1,从2开始累乘到n。 - 时间复杂度为 $O(n)$,空间复杂度为 $O(1)$。
尾递归优化
某些 JavaScript 引擎支持尾调用优化(TCO),可优化递归性能。

function factorialTailRecursive(n, accumulator = 1) {
if (n === 0 || n === 1) {
return accumulator;
}
return factorialTailRecursive(n - 1, n * accumulator);
}
说明:
- 通过
accumulator参数保存中间结果,避免递归栈堆积。 - 需确认运行环境是否支持 TCO(如 Safari)。
大数处理(BigInt)
当 n 较大时(如 n > 20),使用 BigInt 避免精度丢失。
function factorialBigInt(n) {
let result = 1n; // BigInt 字面量
for (let i = 2n; i <= BigInt(n); i++) {
result *= i;
}
return result;
}
说明:
BigInt类型通过后缀n或BigInt()构造函数定义。- 适用于计算超大数阶乘(如
n = 1000)。
性能对比
- 递归:代码简洁,但可能栈溢出(如
n > 10000)。 - 循环:性能稳定,适合大多数场景。
- BigInt:解决大数问题,但需兼容性检查。
根据需求选择合适的方法,常规场景推荐循环实现。






