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;
}
循环方法适合处理较大的n值,性能通常优于递归方法。

使用尾递归优化实现阶乘
尾递归优化可以避免普通递归的堆栈溢出问题,但需要JavaScript引擎支持尾调用优化。
function factorial(n, acc = 1) {
if (n === 0 || n === 1) {
return acc;
}
return factorial(n - 1, n * acc);
}
尾递归优化在支持的环境中能提供更好的性能,但目前并非所有JavaScript引擎都实现了尾调用优化。

使用BigInt处理大数阶乘
当需要计算较大数的阶乘时,可以使用JavaScript的BigInt类型来避免精度丢失。
function factorial(n) {
let result = 1n;
for (let i = 2n; i <= n; i++) {
result *= i;
}
return result;
}
BigInt类型可以处理任意大小的整数,但需要在数字后加n后缀表示BigInt字面量。
使用记忆化优化递归实现
记忆化技术可以缓存已计算的结果,避免重复计算,提高递归方法的效率。
const memo = [1, 1];
function factorial(n) {
if (memo[n] !== undefined) {
return memo[n];
}
memo[n] = n * factorial(n - 1);
return memo[n];
}
记忆化特别适合需要多次计算阶乘的场景,能显著提高性能。






