Почему мой javascript для цикла ничего не делает и вместо этого замораживает мою веб-страницу?

#javascript #loops #if-statement #dom

#javascript #циклы #if-statement #dom

Вопрос:

Мне трудно понять, почему мой код не будет работать. Это действительно простая программа, поэтому я уверен, что есть что-то, чего я не вижу или не вижу, но, похоже, я не могу понять это. Пожалуйста, помогите!

Что он должен делать: возьмите два числа и найдите следующее число, которое больше первого числа и также делится на второе число.

Что происходит: по сути, это просто замораживает мой компьютер, кажется, что цикл просто продолжает выполняться без остановки.

JS:

 function divisibleBy(first, second) {
    var firstNum = document.getElementById('firstNumber').value;
    var secondNum = document.getElementById('secondNumber').value;

    for (var i = firstNum   1; i > firstNum; i  ) {
        if (i % secondNum === 0) {
            document.getElementById('result').innerHTML = i;
        }
    }
}
 

HTML:

 <body>
    <header>
        <h1>Let's Do Some Math!</h1>
        <h2>Type in <u>two</u> numbers and let's figure out the next <br>
            number greater than those two numbers but with a catch...<br>
            the number has to be <u>divisible</u> by the second number you choose.</h2>
    </header>
    <hr>
    <ul>
        <li>
            <label for="firstNumber">First Number:</label>
            <input type="number" id="firstNumber">
        </li>
        <li>
            <label for="secondNumber">Second Number:</label>
            <input type="number" id="secondNumber">
        </li>
        <li>
            <button type="submit" onclick="divisibleBy();">GO</button>
        </li>
    </ul>

    <h2 id="result"></h2>
    <hr>
</body>
 

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

1. В вашем for цикле вы продолжаете увеличивать i , делая i . И вы говорите ему продолжать работать, пока i > firstNum . Это никогда не остановится. Может быть, вы хотели использовать i <= secondNum ?

2. Вместо этого я использовал цикл while и сделал firstNum % secondNum != 0, а затем увеличил i, спасибо за вашу помощь! @blex

Ответ №1:

Проблема: проблема в том, что ваше условие for-loop всегда true выполняется, что приводит к бесконечному циклу, следовательно, страница не реагирует. А также в этом случае нет необходимости принимать аргумент для функции

Решение:

Эта проблема может быть решена математически, без циклов.

 // BEST APPROCH
function divisibleBy() {
    var firstNum = parseInt(document.getElementById('firstNumber').value);
    var secondNum = parseInt(document.getElementById('secondNumber').value);
    
    var result = secondNum*parseInt(firstNum/secondNum 1);
    document.getElementById('result').innerHTML = resu<
    
}
 

Но если вам действительно нужно использовать цикл, вот решение, но имейте в виду, что в настройке для цикла ограничение почти идентично приведенному выше решению (или заданному условию as i <= firstNum*secondNum , поскольку оно уже получило оператор break при попадании в решение)

 // WORST APPROCH
function divisibleBy() {
    var firstNum = parseInt(document.getElementById('firstNumber').value);
    var secondNum = parseInt(document.getElementById('secondNumber').value);
    
    for (var i = firstNum 1; i <= secondNum*(firstNum/secondNum 1); i  ) {
        if (i % secondNum === 0) {
            document.getElementById('result').innerHTML = i;
            break;  
        }
    }
}
 

Но я рекомендую использовать do-While цикл, который будет более удовлетворительным для этой проблемы, и игнорировать выполнение ненужных вычислений для ограничения i в приведенном выше коде.

 // BEST LOOP/SIMPLE APPROCH 
function divisibleBy() {
    var firstNum = parseInt(document.getElementById('firstNumber').value);
    var secondNum = parseInt(document.getElementById('secondNumber').value);
    
    do{
        firstNum  ;
    }
    while(firstNum%secondNum != 0)
    document.getElementById('result').innerHTML = firstNum;
}
 

Ответ №2:

вы используете for (var i = firstNum 1; i > firstNum; i ) , и это условие всегда будет выполняться. из-за чего происходит бесконечный цикл.

попробуйте это :

  for (var i = firstNum   1; ; i  ) {
        if (i % secondNum === 0) {
            document.getElementById('result').innerHTML = I;
              break;
        }
    }
 

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

1. Этот цикл не выполнит назначение функции, когда будет предоставлен ввод, где значение firstNumber больше, чем 2*second-number для, например: firstNumber = 12 и secondNumber = 4 цикл даже не запустится, как 12<=2*4 будет false .

2. Теперь, когда вы думаете об этом, он просто даст ответ как 2*secondNum и только в случае, когда firstNum больше половины secondNum . с дополнительным вычислением цикла.

3. да, тогда мы можем удалить условие и использовать break