方法一:非递归写法
```javascript
function f(n) {
if (0 === n) {
return 1;
}
let res = 1;
for (let i = 1; i <= n; ++i) {
res *= i;
}
return res;
}
```
方法二:递归写法
```javascript
function g(n) {
if (0 === n) {
return 1;
}
return n * g(n - 1);
}
```
方法三:动态规划写法
```javascript
let dp = [];
function h(n) {
if (n < 0 || n !== Math.floor(n)) {
return undefined;
}
if (dp[n]) {
return dp[n];
}
if (0 === n) {
dp[n] = 1;
return 1;
}
for (let i = dp.length; i <= n; ++i) {
dp[i] = dp[i - 1] * i;
}
return dp[n];
}
```
示例
你可以使用以下代码来测试这些函数:
```javascript
console.log(f(5)); // 输出: 120
console.log(g(5)); // 输出: 120
console.log(h(5)); // 输出: 120
```
这些方法各有优缺点,非递归写法性能较好,递归写法代码简洁,动态规划写法适用于需要多次计算阶乘的情况。你可以根据具体需求选择合适的方法。