Почему моя факторная функция возвращает NaN?

1

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

функция

function factorial(n) {
    while(n > 0)
        return factorial(n - 1) * n;
}
  • 4
    где базовый вариант для завершения рекурсии?
  • 0
    @KunalMukherjee базовый случай был моей проблемой. Я исправил
Теги:
while-loop
recursion
nan
factorial

4 ответа

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));
  • 0
    Спасибо ... Но нельзя ли использовать циклы?
  • 0
    Или используйте цикл или рекурсию, но не оба.
Показать ещё 3 комментария
2

Если вы отслеживаете свою рекурсию, вы увидите, когда 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

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

const factorial = (n) => (n > 1) ? factorial(n-1) * n : 1
  • 0
    Более простой. Спасибо...
0

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

console.log(function factorial(n) {

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


  return factorial(n - 1) * n;

}(4));

Ещё вопросы

Сообщество Overcoder
Наверх
Меню