我使用递归和while循环编写了阶乘函数,但每次调用它的返回值为NaN。请问我想知道为什么吗?以及如何解决?
功能
function factorial(n) {
while(n > 0)
return factorial(n - 1) * n;
}
答案 0 :(得分:5)
您缺少基本情况的return
语句。当您不带任何值返回时,该函数将返回undefined
。乘以该值,您将得到NaN
。
此外,您不会循环播放,因此应使用if
而不是while
。
function factorial(n) {
if (n > 0) {
return factorial(n - 1) * n;
} else {
return 1;
}
}
console.log(factorial(10));
您还可以使用循环而不是递归来编写它。
function factorial(n) {
result = 1;
for (var i = 1; i <= n; i++) {
result *= i;
}
return result;
}
console.log(factorial(10));
答案 1 :(得分:2)
如果您跟踪递归,您会看到n达到1时(使n-1 = 0并调用了factorial(0)),您的函数不知道下一步该怎么做,并且不返回任何数字( NaN)。 NaN与所有其他事物相乘,返回另一个NaN。
为您的函数添加一条指令以处理n = 0:
function factorial(n) {
if (n == 0) return 1;
while(n > 0)
return factorial(n - 1) * n;
}
答案 2 :(得分:0)
只需将base case n === 0添加到n === 1即可结束尾递归。
console.log(function factorial(n) {
if (n === 0 || n === 1) {
return 1;
}
return factorial(n - 1) * n;
}(4));
答案 3 :(得分:0)
您也可以将其写成一行:
const factorial = (n) => (n > 1) ? factorial(n-1) * n : 1