迭代数组列表

Sim*_*ann 8 java arrays recursion

我有一个看起来像这样的设置:

List<int[]> list = new LinkedList<int[]>();
list.add(new int[] {1, 3, 4});
list.add(new int[] {4, 5});
list.add(new int[] {1, 4, 6});
Run Code Online (Sandbox Code Playgroud)

编写代码时我不知道数组的大小.我试图遍历整个设置以生成所有可能的组合:

141
144
146
151
154
156
341
...

我目前正在使用递归来实现这个目的:

public static void recursive(List<int[]> list) {
    recursive(list, 0, "");
}

private static void recursive(List<int[]> list, int counter, String string)  {
    if (counter == list.size())
        System.out.println(string);
    else
        for (int i: list.get(counter))
            recursive(list, counter + 1, string + i);
}
Run Code Online (Sandbox Code Playgroud)

我有两个问题:

  1. 我记得在一些讲座中听到递归总是可以用循环代替,但我不能为这种情况做.这个循环版本怎么样?

  2. 有没有更好的方法来解决这个问题?

Jul*_*ght 6

这是一个输出所有数组元素组合的非递归方法.它绝对比递归解决方案更复杂.它的工作原理是将记录保存在一个补充数组中,该数组最近在列表中的每个数组中输出了该数字.

import java.util.Arrays;
import java.util.LinkedList;
import java.util.List;

public class Iter {

    public static void main(String[] args) {
        List<int[]> list = new LinkedList<int[]>();
        list.add(new int[] { 1, 3, 4 });
        list.add(new int[] { 4, 5 });
        list.add(new int[] { 1, 4, 6 });

        iter(list);
    }

    private static void iter(List<int[]> list) {
        int[] index = new int[list.size()];
        Arrays.fill(index, 0);
        boolean done = false;

        do {
            // Output digits for this row
            for (int i = 0; i < list.size(); i++) {
                System.out.print(list.get(i)[index[i]]);
            }
            System.out.println();

            // Rollover digits, starting from last
            for (int j = list.size() - 1; j >= 0; j--) {
                index[j] = (index[j] + 1) % list.get(j).length;
                if (index[j] > 0) break;
                if (j == 0) done = true;
            }
        } while (!done);
    }

}
Run Code Online (Sandbox Code Playgroud)

输出:

141
144
146
151
154
156
341
344
346
351
354
356
441
444
446
451
454
456
Run Code Online (Sandbox Code Playgroud)