Как мне разложить число на множители?

#javascript #jquery #debugging

#javascript #jquery #отладка

Вопрос:

Когда я запускаю этот код в Chrome, он сообщает «превышен максимальный размер стека вызовов».

http://codepen.io/tcadams9/pen/JRLyOq

 if (randomNum === 0 || randomNum === 1)
    return 1;
for (var i = randomNum - 1; i >= 1; i--) {
    num *= i;
}
return factorial();

$("#button2").click(factorial);
  

Комментарии:

1. это вся функция? Plx дает нам заголовок функции и определение случайного числа

2. Если randomNum значение равно 0, for оно становится бесконечным.

3. Да, это целая функция. Если щелкнуть ссылку codepen, в ней должен быть весь код. Когда я использовал этот код в консоли Chrome, он работал, но как только я пытаюсь связать его с HTML-страницей, он все портит. Я думаю, что именно здесь мой код может быть неправильным.

Ответ №1:

Вы там путаете переменные с элементами DOM. Значение элемента DOM с идентификатором «randomNum» не равно переменной randomNum . Чтобы получить значение, вам нужно $("#randomNum").val() . Похоже, это сочетание рекурсивного и нерекурсивного подхода. Вам нужно это очистить: явный:

 randomNum = 6; //set the value before

function factorial () {
    var num =1;
    for (var i = randomNum - 1; i >= 1; i--) {
        num *= i;
    }
    return num;
}
  

и

 $("#button2").click(function () {
  randomNumber = $("#randomNumber").val();
  $("#Factorial").html(
    factorial()
  )
})
  

или
Рекурсивный

 function factorial (randomNum) {
    if (randomNum === 0 || randomNum === 1)
        return 1;
    return randomNum * factorial(randomNum-1);
}
  

однако вы не можете вызвать эту функцию через «click», поскольку у нее не будет randomNumber аргумента.
Чтобы исправить это, вам нужно изменить регистрацию evenHandler на

 $("#button2").click(function () {
  $("#Factorial").html(
    factorial($("#randomNumber").val())
  )
})
  

Проверял, все работало нормально.