用js实现阶乘
递归实现
递归是一种通过函数调用自身来解决问题的方法。对于阶乘问题,递归实现非常直观。
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;
}
迭代实现通常比递归实现更高效,尤其是在处理大数时。

尾递归优化
尾递归是递归的一种特殊形式,可以被某些JavaScript引擎优化以避免栈溢出。
function factorial(n, acc = 1) {
if (n === 0 || n === 1) {
return acc;
}
return factorial(n - 1, n * acc);
}
尾递归优化需要JavaScript引擎支持,并非所有环境都适用。

使用BigInt处理大数
JavaScript的Number类型在计算较大阶乘时会失去精度,使用BigInt可以解决这个问题。
function factorial(n) {
let result = 1n;
for (let i = 2n; i <= n; i++) {
result *= i;
}
return result;
}
使用BigInt需要在数字后加n后缀,适用于需要精确计算大数阶乘的场景。
缓存优化
对于需要多次计算阶乘的场景,可以使用缓存来存储已计算的结果以提高性能。
const factorialCache = [1n, 1n];
function factorial(n) {
if (factorialCache[n]) {
return factorialCache[n];
}
for (let i = factorialCache.length; i <= n; i++) {
factorialCache[i] = factorialCache[i - 1] * BigInt(i);
}
return factorialCache[n];
}
缓存优化特别适合需要频繁计算阶乘的应用场景。






