如何递归地嵌套for循环?

Rum*_*kin 21 java recursion

我有一个必须执行以下操作的方法:

for (int a01 = 1; a01 <= 25; a01++) {
    for (int a02 = a01 + 1; a02 <= 25; a02++) {
        for (int a03 = a02 + 1; a03 <= 25; a03++) {
            ...
            System.out.println(a01 + "," + a02 + "," + ... + "," + a015);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

我想指定嵌套的数量(在上面的例子中,我想要15嵌套).有没有办法在这里使用递归编程?

Chr*_*ies 17

是.这可以通过递归编程来执行.

我假设你不喜欢在源代码中嵌套这些嵌套 - 就像在你的例子中一样,因为这是非常难看的编程 - 就像评论员解释的那样.

以下(伪Java类)代码说明了它.我假设嵌套的固定深度.那么你实际上喜欢循环一个维度深度的整数向量.

int[] length = new int[depth];
int[] counters = new int[depth];
Run Code Online (Sandbox Code Playgroud)

必须将数组counters初始化为0(Arrays.fill(counters,0)).必须将数组length初始化为相应for循环的迭代次数.

我假设你喜欢在内循环中执行某个操作.我会称之为 performOperation(int[] counters); - 这取决于多维计数器,即外部的计数器.

然后,您可以通过调用运行嵌套的for循环

nestedLoopOperation(counters, length, 0);
Run Code Online (Sandbox Code Playgroud)

哪里

void nestedLoopOperation(int[] counters, int[] length, int level) {
    if(level == counters.length) performOperation(counters);
    else {
        for (counters[level] = 0; counters[level] < length[level]; counters[level]++) {
            nestedLoopOperation(counters, length, level + 1);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

在您的情况下,您的System.out.println()将是

performOperation(int[] counters) {
    String counterAsString = "";
    for (int level = 0; level < counters.length; level++) {
        counterAsString = counterAsString + counters[level];
        if (level < counters.length - 1) counterAsString = counterAsString + ",";
   }
   System.out.println(counterAsString);
}
Run Code Online (Sandbox Code Playgroud)