Выполнение рекурсивной функции на входе javascript - PullRequest
1 голос
/ 08 февраля 2020

Я пытаюсь запустить рекурсивную функцию, которая вычисляет факториал числа на входе HTML. Я уже знаю, как сделать это с помощью итерации, я хочу достичь результата рекурсивно. Но когда я делаю это таким образом, я получаю ошибку «слишком много рекурсии». Чего мне не хватает?

HTML

    <input type="text" name="factorial_input" placeholder="Enter a number">
    <div class="button" onclick="calculateFactorial()">Let's see the factorial</div>

JS

function calculateFactorial(getInputValue) {
getInputValue = document.querySelector("input").value;

if (!getInputValue) {
    console.log("You must enter a number");
} else if (getInputValue == 0) {
    return console.log("1");
} else {
    return console.log(getInputValue *= calculateFactorial(getInputValue - 1));
}

// console.log(getInputValue);

}

Ответы [ 2 ]

1 голос
/ 08 февраля 2020

У вас бесконечные проблемы рекурсии, потому что вы извлекаете значение из ввода в рекурсивной функции, и поэтому переменная getInputValue каждый раз получает значение fre sh. Это неправильная реализация, которую вы сделали. Попробуйте приведенный ниже пример.

HTML

<input type="text" name="factorial_input" placeholder="Enter a number">
<div class="button" onclick="calculateFactorial()">Let's see the factorial</div>

Сценарий

function calculateFactorial(getInputValue) {
    let getInputValue = parseInt(document.querySelector("input").value);
    console.log(fact(getInputValue));
}

function fact(n){
    if (n === undefined) {
        return 0;
    } else if (n === 0) {
        return 1;
    } else {
        return n *= fact(n - 1);
    }
}

Рекурсивной функции необходимо удовлетворительное условие для возврата из recusrion для возврата стек вызовов. В противном случае, это будет go на бесконечный вызов.

0 голосов
/ 08 февраля 2020

Почему у вас getInputValue в качестве параметра функции, если вы все равно не передаете его функции?

Не смешивайте все вместе, это только усложнит понимание.

Вместо этого создайте функцию факториала, которая вычисляет только факториальное значение, передайте значение ввода в функцию, а затем console.log ().

function factorial(number) {
  return number == 1 || number == 0 ? number : number * factorial(number - 1);
}
...