【问题标题】:Why is my factorial function returning NaN?为什么我的阶乘函数返回 NaN?
【发布时间】:2019-05-21 16:04:37
【问题描述】:

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

功能

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

【问题讨论】:

  • 结束递归的基本情况在哪里?
  • @KunalMukherjee 基本情况是我的问题。我已经修好了

标签: javascript recursion while-loop nan factorial


【解决方案1】:

您缺少基本情况的 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));

【讨论】:

  • 谢谢...但是不能循环使用吗?
  • 使用循环或递归,但不能同时使用。
  • 我添加了循环版本。
  • @Hung-Thai 回答了我的问题
【解决方案2】:

如果你跟踪你的递归,你会看到当 n 达到 1,这使得 n-1 = 0 并且阶乘(0)被调用,你的函数不知道接下来要做什么并且不返回任何数字(南)。该 NaN 与返回另一个 NaN 的所有其他事物相乘。

为您的函数添加一条指令以处理 n = 0:

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

【讨论】:

    【解决方案3】:

    只需将base case n === 0 添加到 n === 1 即可结束尾递归。

    console.log(function factorial(n) {
    
      if (n === 0 || n === 1) {
        return 1;
      }
    
    
      return factorial(n - 1) * n;
    
    }(4));

    【讨论】:

      【解决方案4】:

      你也可以单行写:

      const factorial = (n) => (n > 1) ? factorial(n-1) * n : 1
      

      【讨论】:

        猜你喜欢
        • 2020-02-22
        • 1970-01-01
        • 2017-08-04
        • 1970-01-01
        • 2016-09-19
        • 2021-06-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多