java - 如何用java写n级内嵌循环

标签 java algorithm

给定 M 个整数(N1、N2、Nm),我想编写一个 N 级嵌入式循环,如下所示:

for (int a = 0; a < N1; a++)
  for (int b = 0; b < N2; b++)
    for (int c = 0; c < N3; c++)
      ....
        for (int m = 0; m < Nm; m++)
          operation

因为 M 是一个变量,我不能写固定数字级别的 for 循环。有什么技巧可以帮助?

最佳答案

不需要递归。相反,将每个迭代器视为数字中的一个数字。当你增加数字时,你增加最后一位,如果它超过限制(通常是 10),它被设置为 0,并且它左边的数字增加,重复溢出逻辑。

在这种情况下,每个“数字”都是一个独立的计数器,每个都有自己的“限制”,即给定 Nx 的值。如果将这些限制值存储在一个数组中,并将计数器保存在一个相同大小的数组中,则逻辑相当简单。

这是一个优化版本的示例,它使用标签直接退出嵌套循环:

int[] n = { 3, 4, 5 }; // m = 3: N1 = 3, N2 = 4, N3 = 5

int[] i = new int[n.length]; // All "digits" are 0
LOOP: for (;;) {
    // operation using i[] here, e.g.
    System.out.println(Arrays.toString(i));

    // Process "digits" from last to first
    for (int j = i.length - 1; ; j--) {
        if (j < 0) // Exit main loop if first "digit" overflowed
            break LOOP;
        if (++i[j] < n[j]) // Increment "digit", and if not overflowed:
            break;         //   exit digit-loop, i.e. loop back to process
        i[j] = 0; // Reset "digit" to 0, then process next (to left) "digit"
    }
}

输出

[0, 0, 0]
[0, 0, 1]
[0, 0, 2]
[0, 0, 3]
[0, 0, 4]
[0, 1, 0]
[0, 1, 1]
[0, 1, 2]
[0, 1, 3]
[0, 1, 4]
[0, 2, 0]
[0, 2, 1]
[0, 2, 2]
[0, 2, 3]
[0, 2, 4]
[0, 3, 0]
[0, 3, 1]
[0, 3, 2]
[0, 3, 3]
[0, 3, 4]
[1, 0, 0]
[1, 0, 1]
[1, 0, 2]
[1, 0, 3]
[1, 0, 4]
[1, 1, 0]
[1, 1, 1]
[1, 1, 2]
[1, 1, 3]
[1, 1, 4]
[1, 2, 0]
[1, 2, 1]
[1, 2, 2]
[1, 2, 3]
[1, 2, 4]
[1, 3, 0]
[1, 3, 1]
[1, 3, 2]
[1, 3, 3]
[1, 3, 4]
[2, 0, 0]
[2, 0, 1]
[2, 0, 2]
[2, 0, 3]
[2, 0, 4]
[2, 1, 0]
[2, 1, 1]
[2, 1, 2]
[2, 1, 3]
[2, 1, 4]
[2, 2, 0]
[2, 2, 1]
[2, 2, 2]
[2, 2, 3]
[2, 2, 4]
[2, 3, 0]
[2, 3, 1]
[2, 3, 2]
[2, 3, 3]
[2, 3, 4]

关于java - 如何用java写n级内嵌循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40954694/

相关文章:

java - 试图在 java 中将 char 数组作为参数传递并出现索引错误

c++ - 当表示为对象的一维 vector 时有效地旋转 NxM 矩阵 (C++)

java - 使用logback-spring.xml时如何保留springboot默认日志

java - 从 GSON 到 Json 的大规模 StackOverflowError

java.lang.ClassCastException : androidx. appcompat.widget.AppCompatImageButton 无法转换为 android.widget.Button

java - JTextArea 中的滚动条事件

c++ - 范围 10^18 的大模算法?

string - 寻找想法 : lexicographically sorted suffix array of many different strings compute efficiently an LCP array

arrays - 对分布在多个文件中的 "slices"多个向量进行排序

algorithm - 如何为水壶定义启发式函数?