【问题标题】:Why does this nested loop only iterate 14 times?为什么这个嵌套循环只迭代 14 次?
【发布时间】:2023-01-30 05:06:52
【问题描述】:

我是 Java 初学者。我正在编写一个方法,该方法应该遍历字节数组的每个可能值,但数组中每个字节数的限制是 13。因此,我使用了嵌套循环。这是我目前拥有的代码:

public static void iterateThroughMoves() {
byte[] moveSet = {0, 0, 0, 0};

        while(moveSet[0] < 14) {
            while(moveSet[1] < 14) {
                while(moveSet[2] < 14) {
                    while(moveSet[3] < 14) {
                        System.out.println(Arrays.toString(moveSet));
    
                        moveSet[3] ++;
                    }
    
                    moveSet[2] ++;
                }
    
                moveSet[1] ++;
            }
    
            moveSet[0] ++;
        }
    }

出于某种原因,当我运行此方法时,它只会将其打印到控制台:

[0, 0, 0, 0]
[0, 0, 0, 1]
[0, 0, 0, 2]
[0, 0, 0, 3]
[0, 0, 0, 4]
[0, 0, 0, 5]
[0, 0, 0, 6]
[0, 0, 0, 7]
[0, 0, 0, 8]
[0, 0, 0, 9]
[0, 0, 0, 10]
[0, 0, 0, 11]
[0, 0, 0, 12]
[0, 0, 0, 13]

Process finished with exit code 0

它不应该打印数组的每个可能值吗?为什么它会跳出循环?除非字节数组的第一个索引的值大于 13,否则第一个 while 循环不会中断,并且正如我们在控制台输出中看到的那样,它永远不会大于 13。

老实说,我不知道该尝试什么。我一直在看代码,但我无法弄清楚哪里出了问题。正如我之前提到的,我是一个初学者,所以如果这是一个非常简单的问题和一个非常简单的解决方案,请不要生我的气。

【问题讨论】:

  • 您基本上重新构建了一个 for 循环,但省略了初始化部分,因此您依赖于最初为 0 的循环变量,但永远不会在内部循环中重新设置它们。
  • 啊学习者实验。 “嘿,这与 for 循环一起工作得很好,但让我们将它转​​换为 while 循环,因为我刚刚了解它”

标签: java loops while-loop


【解决方案1】:

如果您想遍历每个索引中 0-13 的所有可能组合,则需要重置内部计数器(索引 1、2 和 3)。

    while(moveSet[0] < 14) {
        moveSet[1] = 0;             // RESET
        while(moveSet[1] < 14) {
            moveSet[2] = 0;         // RESET
            while(moveSet[2] < 14) {
                moveSet[3] = 0;     // RESET
                while(moveSet[3] < 14) {
                    System.out.println(Arrays.toString(moveSet));

                    moveSet[3] ++;
                }

                moveSet[2] ++;
            }

            moveSet[1] ++;
        }

        moveSet[0] ++;
   

打印所有 14x14x14x14==38416 组合的另一种方法是使用单个 for 循环并使用模运算。

int iterations = 14*14*14*14;  // 38416
for (i = 0; i < iterations; i++) {
    int [] moveSet = {0,0,0,0};
    moveSet[3] = i % 14;
    moveSet[2] = (i/14) % 14;
    moveSet[1] = ((i/14)/14) % 14;
    moveSet[0] = (((i/14)/14)/14) % 14;
    System.out.println(Arrays.toString(moveSet));
}

【讨论】:

  • 谢谢!您还知道哪种方法计算速度更快吗?
【解决方案2】:

当您的最内层循环执行一次时,它将永远不会再满足条件:moveSet[3] 保持在 14,不再进行打印。

你想在循环后将值设置回 0 吗?可能。也适用于其他值。

您可能希望在单步调试器中检查这些值。

【讨论】:

    【解决方案3】:

    我认为你的问题在于内部循环值,它们没有重置为 0,所以你的函数只会运行 14 次, 尝试在每个内部循环后将您的值重置为 0/ 这应该可以帮助您打印数组的所有可能值 例子

     while(moveSet[0] < 14) {
                while(moveSet[1] < 14) {
                    while(moveSet[2] < 14) {
                        while(moveSet[3] < 14) {
                            System.out.println(Arrays.toString(moveSet));
    
                            moveSet[3] ++;
                        }
                        moveSet[3]=0;
                        moveSet[2] ++;
                    }
                    moveSet[2]=0;
                    moveSet[1] ++;
                }
                 moveSet[1]=0;
                moveSet[0] ++;
            }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-05-14
      • 2019-03-26
      • 2017-10-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-08-03
      • 1970-01-01
      相关资源
      最近更新 更多