【问题标题】:Can anyone see where the infinite loop in my program is?谁能看到我程序中的无限循环在哪里?
【发布时间】:2013-02-24 03:46:33
【问题描述】:

这个程序的目的是找到能被所有整数 1 到 20 整除的最小数。我知道它可以变得更高效,但我现在对优化它不感兴趣。当我执行程序时,它似乎永远挂起,这让我相信某处存在无限循环。不过我好像找不到。不知道是哪部分代码导致了问题,而且比较简洁,这里就全部贴出来吧。

public class Problem5{
  public static void main(String[]args){

    boolean notFound = true;
    while(notFound){
      int n = 20;
      if(testDivide(n)){
        System.out.println(n);
        notFound = false;
      }
      else
        n++;
    }
  }

  private static boolean testDivide(int target){
    for(int i = 20; i > 0; i--){
      if(target % i != 0)
        return false;
    }
    return true;
  }
}

如果有人能帮我解决这个问题,我将不胜感激。

附加信息:该程序也从不输出任何数字,这让我相信 if(testDivide(n)) 永远不会评估为真。

【问题讨论】:

  • 您确定notFound 在所有情况下都会设置为false 吗?
  • 这里有一个提示:这是 while 循环。
  • 你试过调试吗?
  • 您在 while 循环中将 n 的值初始化为 20,因为对于 testDivide(20),n 始终为 20,这将始终返回 false,因为 20 % 19 != 0 返回 @ 987654328@。因此,从您的 while 循环中删除 int n = 20
  • 哦,这太明显了!我不敢相信我没有看到!我也问了一个朋友,他也错过了。你们真的很棒,谢谢。

标签: java infinite-loop


【解决方案1】:

您正在将 while 循环内的 n 的值初始化为 20,因为对于 testDivide(20),n 始终为 20,因为 20 % 19 != 0 返回 false,它将始终返回 false。因此,从您的 while 循环中删除 int n = 20

【讨论】:

  • 谢谢。我花了很长时间摆弄我的循环和控制语句的条件,我完全错过了。这是一个如此简单的修复。谢谢!
  • 但是20 % 20 = 0 因为余数始终为零,这将导致 for 循环将计数器减一,测试它的终止条件,然后 20 将在表达式中以减量形式计算i 的值,在这种情况下它将返回 false,恕我直言。可能是我错过了什么,刚醒来,半睁着眼睛回答这个问题:-)。
  • @realityChemist : 欢迎您并保持微笑 :-)
  • 回顾我的老问题,我意识到我从来没有真正接受过你的回答!所以你去吧,这应该是你的一些代表。
【解决方案2】:
boolean notFound = true;
while(notFound){
    int n = 20;

应该是

boolean notFound = true;
int n = 20;
while(notFound) {

【讨论】:

    【解决方案3】:

    您的 for 循环确保您返回 false,然后您的 while 循环始终将 i 设置为 20,这是您的无限循环。

    【讨论】:

      【解决方案4】:

      查看while 循环:

      while(notFound){
            int n = 20;
            if(testDivide(n)){
              System.out.println(n);
              notFound = false;
            }
            else
              n++;
          }
      

      首先执行while循环时,n的值设置为20
      测试除法返回假。
      n 的值递减为 19
      循环再次执行
      n 的值被重新初始化为 20
      这是在while 循环之外初始化n 的问题。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-02-29
        • 2016-12-14
        相关资源
        最近更新 更多