我正在编写一个接收ArrayList的程序,我需要计算从零列表开始的所有可能的排列,直到相应输入列表中的值。
有谁知道如何迭代计算这些值?
例如,给定[1 2]作为输入,它应该找到并存储以下列表:
[0 0], [1 0], [1 1], [1 2], [0 1], [0 2]
谢谢!
答案 0 :(得分:4)
这是一个标准的递归生成器:
import java.util.Arrays;
//...
static void generate(int... limits) {
generate(new int[limits.length], limits, 0);
}
static void generate(int[] arr, int[] limits, int n) {
if (n == limits.length) {
System.out.println(Arrays.toString(arr));
} else {
for (int i = 0; i <= limits[n]; i++) {
arr[n] = i;
generate(arr, limits, n + 1);
}
}
}
//....
generate(1, 2);
/* prints
[0, 0]
[0, 1]
[0, 2]
[1, 0]
[1, 1]
[1, 2]
*/
这与您编写可变数量的嵌套循环的方式相同。使用递归,您只需编写一个循环,它实际上可以具有变量嵌套深度(如果您不小心,则无限!)。
还有迭代即非递归版本:
static void generateI(int... limits) {
int[] arr = new int[limits.length];
int n;
do {
System.out.println(Arrays.toString(arr));
n = limits.length - 1;
while (n >= 0 && arr[n] == limits[n]) {
arr[n] = 0;
n--;
}
if (n >= 0) arr[n]++;
} while (n >= 0);
}
除了每个位置都有自己的限制之外,其工作方式与二进制算术(或任何基数,实际上)的增量1相同。
例如,在基数10中,这是增量的方式:
12399
^ (is highest digit, therefore set to 0, move left)
12390
^ (is highest digit, therefore set to 0, move left)
12400
^ (not the highest digit, add 1, DONE!)
答案 1 :(得分:1)
看起来你实际上并不想要permutations。如果给出一个数组X = [1,2],它的排列正好是[1,2]和[2,1]。按照你的例子,你希望它生成所有元组z,其中0&lt; = z&lt; = X.
这个元组列表问题很好地解决了polygenelubricants的解决方案。你说的排列问题是由Fazal的解决方案解决的。