我正在編寫一個接受ArrayList的程序,我需要計算從零列表開始直到相應輸入列表中的值的所有可能排列。給定一個整數數組[x0 x1 x2],如何計算從[0 0 0]到[x0 x1 x2]的所有可能排列?
有誰知道如何迭代計算這些值?
例如,給定[1 2]作爲輸入,它應該發現並存儲以下列表:
[0 0], [1 0], [1 1], [1 2] , [0 1], [0 2]
謝謝!
我正在編寫一個接受ArrayList的程序,我需要計算從零列表開始直到相應輸入列表中的值的所有可能排列。給定一個整數數組[x0 x1 x2],如何計算從[0 0 0]到[x0 x1 x2]的所有可能排列?
有誰知道如何迭代計算這些值?
例如,給定[1 2]作爲輸入,它應該發現並存儲以下列表:
[0 0], [1 0], [1 1], [1 2] , [0 1], [0 2]
謝謝!
下面是一個標準的遞歸發生器:
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!)
它看起來並不像你真正想要permutations。如果給出一個數組X = [1,2],則其排列正好是[1,2]和[2,1]。以你爲例,你希望它生成所有元組z,其中0 < = z < = X
這個元組列表問題很好地解決了polygenelubricants的解決方案。您所陳述的排列問題可以通過Fazal的解決方案來解決。
這聽起來像是你要求一個「笛卡兒積」,其中每個軸由n個連續的非負整數組成。 – 2010-04-23 21:23:10