为什么我的阶乘函数返回NaN?

时间:2018-12-21 06:57:19

标签: javascript recursion while-loop nan factorial

我使用递归和while循环编写了阶乘函数,但每次调用它的返回值为NaN。请问我想知道为什么吗?以及如何解决?

功能

function factorial(n) {
    while(n > 0)
        return factorial(n - 1) * n;
}

4 个答案:

答案 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