【问题标题】:Why does this while loop cause an infinite loop?为什么这个while循环会导致无限循环?
【发布时间】:2014-08-11 08:56:35
【问题描述】:
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循环会导致无限循环呢?

【问题讨论】:

  • 提示:input == 1 时会发生什么?
  • 1 4 2 1 4 2 1 4 2 1 4 2 1 4 2 1 4 2
  • "每次input的值为偶数时,除以2,所以最终应该是1,对吧?那为什么这个while循环会导致死循环呢?" - 也许您可以问自己,您的程序与您的假设之​​间的区别在于程序在达到“1”时应该退出。
  • 谢谢大家。我在这里犯的最大错误确实是认为当输入达到 1 时循环会停止执行。

标签: java while-loop logic infinite-loop


【解决方案1】:

问题是你的条件 - 因为即使你达到 1,循环也会继续。 将while (input >= 1) 替换为while (input > 1)

【讨论】:

    【解决方案2】:

    这会产生一个无限循环,因为input 永远不会达到零或更低。没有偶数>=1 减半后为零,也没有奇数>=1 减半后为-1。所以input 将永远是>=1 并且你有一个无限循环。

    【讨论】:

      【解决方案3】:

      如果the Collatz conjecture 为真,则循环将始终到达 1 -- 问题是您不会在 1 处停止循环:)

      while (input >= 1) 更改为while (input > 1)

      【讨论】:

      • 好吧,措辞不好。
      猜你喜欢
      • 2014-05-06
      • 1970-01-01
      • 1970-01-01
      • 2013-06-17
      • 1970-01-01
      • 2018-03-17
      • 2012-09-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多