Почему этот цикл while вызывает бесконечный цикл?

1
public void calculate(int input) {

inputField.setText("" + input);

while (input >= 1) {

    if (input % 2 == 0) {
        input = input / 2;
    } else {
        input = (input * 3) + 1;
    }
    output.append("" + input);
    }

}

Выходной переменной является JTextArea, а inputField - это JTextField, где пользователь вводит целое число.

Я вызываю метод и инициализирую входную переменную здесь:

@Override
public void actionPerformed(ActionEvent e) {

    input = Integer.parseInt(inputField.getText());
    calculate(input);

    }

}

Каждый раз, когда значение ввода четное, оно делится на 2, чтобы оно в конечном итоге достигало 1, правильно? Тогда почему этот цикл while вызывает бесконечный цикл?

  • 3
    подсказка: что происходит при input == 1 ?
  • 0
    1 4 2 1 4 2 1 4 2 1 4 2 1 4 2 1 4 2
Показать ещё 2 комментария
Теги:
logic
while-loop
infinite-loop

3 ответа

3
Лучший ответ

Проблема заключается в том, что ваше условие - потому что даже если вы достигнете 1, цикл продолжится. Замените while (input >= 1) с помощью while (input > 1)

0

Если гипотеза Collatz верна, что цикл всегда достигнет 1 - проблема в том, что вы не прекращаете цикл в 1 :)

Измените while (input >= 1) на while (input > 1).

  • 0
    Хорошо, это было плохо сформулировано.
0

Это дает бесконечный цикл, потому что input никогда не может достигнуть нуля или ниже. Нет четного числа >=1 которое при уменьшении пополам дает нуль, а нечетное число >=1 которое при -1. Поэтому input всегда будет >=1 и у вас бесконечный цикл.

Ещё вопросы

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