【问题标题】:Nested loop not iterating properly嵌套循环未正确迭代
【发布时间】:2015-01-13 07:48:23
【问题描述】:

我有这段代码,其中有两个循环“i”和“j”。

'j' 是内循环变量,它应该在外循环单次运行时运行 999 到 100。

但它随机运行, 假设 i=999

j=912

j=911

j=910

j=909

j-908

j=907

j=906

然后突然内循环退出,从外循环减1并使i=998

然后开始'j'循环

j=908

j=907

j=906

j=905

j=906

j=905

j=904

j=903

j=902

然后退出内循环......

    int product=0;
    mainloop:
    for(int i=999;i>99;i--){
        for(int j=999;j>99;j--){
            boolean flag= doSomething(i*j);
            if(flag){
                product=i*j;
                System.out.println("Digits are: "+i+" and "+j);
                break mainloop;
            }
        }
    }

 public  boolean doSomething(int product){
        String original= Integer.toString(product),reverse="";
        int length = original.length();
        for ( int i = length - 1; i >= 0; i-- )
            reverse = reverse + original.charAt(i);
        return (original.equals(reverse));


    }

为什么会这样?为什么内循环没有完成从 999 到 100 的循环?

编辑:要清楚,'flag' 仅在 j=913 和 i=993 时为真,这是循环不会中断的主要问题,因为 'j' 永远不会来到 913 但它随机生成数字。此外,'break' 不仅会破坏内部循环,还会破坏主循环。

【问题讨论】:

  • 查看doSomething中的代码。那应该清除它
  • 你在if结束时明确地打破它并回到主循环......
  • 你能显示doSomething的代码吗?

标签: java loops logic nested-loops


【解决方案1】:

您在内部循环中有一个条件 - if(flag) - 如果为真,则从该循环中断。这就是内循环没有完成的原因。它不会“随机”运行。它的行为取决于doSomething(i*j) 方法调用的结果。

使用一些额外的调试打印和您声称拥有的doSomething 的实现来运行您的代码:

  int product=0;
  mainloop:
  for(int i=999;i>99;i--){
    System.out.print ("\n"+i+":");
    for(int j=999;j>99;j--){
      System.out.print (j+",");
      boolean flag= doSomething(i*j);
      if(flag){
        product=i*j;
        System.out.println("\nDigits are: "+i+" and "+j);
        break mainloop;
      }
    }
  }

  public static boolean doSomething(int k)
  {
      return k == 913*993;
  }

给出预期的输出:

999:999,998,997,996,995,994,993,992,991,990,989,988,987,986,985,984,983,982,981,980,...,120,119,118,117,116,115,114,113,112,111,110,109,108,107,106,105,104,103,102,101,100,
998:999,998,997,996,995,994,993,992,991,990,989,988,987,986,985,984,983,982,981,980,...,120,119,118,117,116,115,114,113,112,111,110,109,108,107,106,105,104,103,102,101,100,
997:999,998,997,996,995,994,993,992,991,990,989,988,987,986,985,984,983,982,981,980,...,120,119,118,117,116,115,114,113,112,111,110,109,108,107,106,105,104,103,102,101,100,
996:999,998,997,996,995,994,993,992,991,990,989,988,987,986,985,984,983,982,981,980,...,120,119,118,117,116,115,114,113,112,111,110,109,108,107,106,105,104,103,102,101,100,
995:999,998,997,996,995,994,993,992,991,990,989,988,987,986,985,984,983,982,981,980,...,120,119,118,117,116,115,114,113,112,111,110,109,108,107,106,105,104,103,102,101,100,
994:999,998,997,996,995,994,993,992,991,990,989,988,987,986,985,984,983,982,981,980,...,120,119,118,117,116,115,114,113,112,111,110,109,108,107,106,105,104,103,102,101,100,
993:999,998,997,996,995,994,993,992,991,990,989,988,987,986,985,984,983,982,981,980,979,978,977,976,975,974,973,972,971,970,969,968,967,966,965,964,963,962,961,960,959,958,957,956,955,954,953,952,951,950,949,948,947,946,945,944,943,942,941,940,939,938,937,936,935,934,933,932,931,930,929,928,927,926,925,924,923,922,921,920,919,918,917,916,915,914,913,
Digits are: 993 and 913

编辑,doSomething 当 i==995 和 j==583 时,您发布的返回 true。那是你打破循环的时候。

【讨论】:

  • 'flag' 仅当 j=913 和 i=993 时才为真,这是循环不会中断的主要问题,因为 j 永远不会到达 913,但它会随机生成数字。 'break' 不仅会破坏内部循环,还会破坏主循环。
  • @HappyDev i==995 在 i==993 之前,所以 (i==995,j==583) 在 (i==993,j==913) 之前。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-10-22
  • 1970-01-01
  • 2012-08-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多