# JavaScript如何求10階乘
## 什么是階乘?
在數學中,**階乘**(Factorial)是所有小于及等于該數的正整數的積,記作 `n!`。例如:
5! = 5 × 4 × 3 × 2 × 1 = 120
特別地,`0!` 定義為 1。
## JavaScript實現階乘的5種方法
### 方法1:for循環(基礎版)
```javascript
function factorial(n) {
let result = 1;
for (let i = 1; i <= n; i++) {
result *= i;
}
return result;
}
console.log(factorial(10)); // 輸出: 3628800
特點: - 最直觀的實現方式 - 時間復雜度:O(n) - 空間復雜度:O(1)
function factorial(n) {
if (n === 0 || n === 1) return 1;
return n * factorial(n - 1);
}
console.log(factorial(10)); // 3628800
注意事項: - 存在最大調用棧限制(Chrome約10000層) - 對于大數計算可能導致棧溢出
function factorial(n, acc = 1) {
if (n === 0) return acc;
return factorial(n - 1, n * acc);
}
console.log(factorial(10)); // 3628800
優勢: - 符合尾調用優化條件 - 在支持ES6嚴格模式的引擎中可避免棧溢出
當計算更大的階乘(如100!)時:
function bigFactorial(n) {
let result = 1n; // BigInt字面量
for (let i = 1n; i <= BigInt(n); i++) {
result *= i;
}
return result;
}
console.log(bigFactorial(10).toString()); // "3628800"
為什么需要BigInt: - JavaScript的Number類型最大安全整數是2^53-1 - 20! = 2432902008176640000 已超過安全整數范圍
const factorial = n =>
Array.from({length: n}, (_, i) => i + 1)
.reduce((acc, val) => acc * val, 1);
console.log(factorial(10)); // 3628800
特點: - 無副作用 - 利用數組的reduce方法 - 代碼簡潔但效率略低
方法 | 10!耗時 | 10000!可行性 | 代碼復雜度 |
---|---|---|---|
for循環 | 最快 | 不可行 | 低 |
遞歸 | 中等 | 不可行 | 中 |
尾遞歸 | 中等 | 部分支持 | 中 |
BigInt | 較慢 | 可行 | 中 |
函數式 | 最慢 | 不可行 | 高 |
const memo = [1, 1]; // 緩存0!和1!
function memoFactorial(n) {
if (memo[n] !== undefined) return memo[n];
return memo[n] = n * memoFactorial(n - 1);
}
使用Gamma函數(Γ(n) = (n-1)!):
// 近似計算
function gamma(x) {
// 實現Gamma函數的近似計算
// ...
}
JavaScript實現階乘有多種方式,選擇取決于具體場景。對于10!這樣的常規計算,基礎的for循環是最佳選擇。隨著現代JavaScript的發展,BigInt的出現使得大數階乘計算成為可能,而函數式編程則提供了更聲明式的實現方式。 “`
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。