js实现阶乘
递归实现阶乘
递归是一种常见的阶乘实现方式,通过函数调用自身逐步分解问题。
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 factorialIterative(n) {
let result = 1;
for (let i = 2; i <= n; i++) {
result *= i;
}
return result;
}
说明:
- 初始化
result为1,从2开始遍历到n。 - 每次迭代将当前值
i与result相乘。
尾递归优化实现
尾递归优化可避免递归的栈溢出问题,但需确保 JavaScript 引擎支持(如严格模式)。
function factorialTailRecursive(n, accumulator = 1) {
if (n === 0 || n === 1) {
return accumulator;
}
return factorialTailRecursive(n - 1, n * accumulator);
}
说明:
- 使用
accumulator参数保存中间结果,减少调用栈开销。 - 需在严格模式下运行(
'use strict')以启用优化。
使用 reduce 实现
利用数组的 reduce 方法简洁实现阶乘。
function factorialReduce(n) {
return Array.from({ length: n }, (_, i) => i + 1)
.reduce((acc, val) => acc * val, 1);
}
说明:
Array.from生成[1, 2, ..., n]的数组。reduce方法累乘所有数组元素,初始值为1。
性能与注意事项
- 递归:代码简洁,但大数值可能导致栈溢出(如
n > 10000)。 - 循环:性能稳定,适合大数值计算。
- 尾递归:需引擎支持,否则与普通递归无异。
- 边界处理:建议添加对负数或非整数的校验(如抛出错误)。
function factorialSafe(n) {
if (n < 0 || !Number.isInteger(n)) {
throw new Error('Input must be a non-negative integer');
}
return factorialIterative(n); // 选择上述任一实现
}






