用js实现阶乘
递归方法实现阶乘
递归是计算阶乘的经典方法,通过函数调用自身实现。n的阶乘(n!)定义为n * (n-1)!,递归终止条件为n等于0或1。
function factorialRecursive(n) {
if (n === 0 || n === 1) {
return 1;
}
return n * factorialRecursive(n - 1);
}
// 示例用法
console.log(factorialRecursive(5)); // 输出120
迭代方法实现阶乘
使用循环结构可以避免递归可能导致的堆栈溢出问题,特别适合计算大数的阶乘。
function factorialIterative(n) {
let result = 1;
for (let i = 2; i <= n; i++) {
result *= i;
}
return result;
}
// 示例用法
console.log(factorialIterative(5)); // 输出120
尾递归优化实现
某些JavaScript引擎支持尾调用优化,这种实现方式可以避免递归导致的堆栈溢出。
function factorialTailRecursive(n, accumulator = 1) {
if (n === 0) {
return accumulator;
}
return factorialTailRecursive(n - 1, n * accumulator);
}
// 示例用法
console.log(factorialTailRecursive(5)); // 输出120
使用数组reduce方法
利用JavaScript数组的reduce方法可以简洁地实现阶乘计算。
function factorialReduce(n) {
return Array.from({length: n}, (_, i) => i + 1)
.reduce((acc, val) => acc * val, 1);
}
// 示例用法
console.log(factorialReduce(5)); // 输出120
大数阶乘处理
对于超过JavaScript最大安全整数(2^53-1)的阶乘计算,需要使用BigInt类型。
function factorialBigInt(n) {
let result = 1n;
for (let i = 2n; i <= BigInt(n); i++) {
result *= i;
}
return result;
}
// 示例用法
console.log(factorialBigInt(20).toString()); // 输出2432902008176640000
性能考虑
递归方法代码简洁但可能有堆栈限制,迭代方法更安全。对于大数计算必须使用BigInt。实际应用中应根据具体需求选择合适的方法。







