Почему моя факторная функция возвращает NaN? - PullRequest
0 голосов
/ 21 декабря 2018

Я написал функцию факториала, используя рекурсию и цикл while, но его возвращаемое значение равно NaN при каждом вызове.Пожалуйста, я хочу знать, почему?и как это исправить?

Функция

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

Ответы [ 4 ]

0 голосов
/ 21 декабря 2018

Вы также можете написать это в одной строке:

const factorial = (n) => (n > 1) ? factorial(n-1) * n : 1
0 голосов
/ 21 декабря 2018

Если вы отслеживаете свою рекурсию, вы увидите, когда n достигает 1, что делает n-1 = 0 и вызывается факториал (0), ваша функция не знает, что делать дальше, и не возвращает никакого числа (NaN).Этот NaN умножается на все остальные, возвращая другой NaN.

Добавьте инструкцию для вашей функции для обработки n = 0:

function factorial(n) { 
   if (n == 0) return 1;
   while(n > 0)
      return factorial(n - 1) * n;
  }
0 голосов
/ 21 декабря 2018

Просто добавьте базовый регистр n === 0 к n === 1, чтобы завершить хвостовую рекурсию.

console.log(function factorial(n) {

  if (n === 0 || n === 1) {
    return 1;
  }


  return factorial(n - 1) * n;

}(4));
0 голосов
/ 21 декабря 2018

Вам не хватает оператора 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));
...