Я написал функцию факториала с использованием рекурсии и цикла while, но при каждом вызове возвращается значение NaN. Пожалуйста, я хочу знать, почему? и как это исправить?
функция
function factorial(n) {
while(n > 0)
return factorial(n - 1) * n;
}
Вы пропускаете инструкцию 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));
Если вы отслеживаете свою рекурсию, вы увидите, когда 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;
}
Вы также можете написать это в одну строку:
const factorial = (n) => (n > 1) ? factorial(n-1) * n : 1
Просто добавьте базовый случай n === 0 к n === 1, чтобы завершить хвостовую рекурсию.
console.log(function factorial(n) {
if (n === 0 || n === 1) {
return 1;
}
return factorial(n - 1) * n;
}(4));