2010-04-19 77 views
4

我正在編寫一個接受ArrayList的程序,我需要計算從零列表開始直到相應輸入列表中的值的所有可能排列。給定一個整數數組[x0 x1 x2],如何計算從[0 0 0]到[x0 x1 x2]的所有可能排列?

有誰知道如何迭代計算這些值?

例如,給定[1 2]作爲輸入,它應該發現並存儲以下列表:

[0 0], [1 0], [1 1], [1 2] , [0 1], [0 2]

謝謝!

+0

這聽起來像是你要求一個「笛卡兒積」,其中每個軸由n個連續的非負整數組成。 – 2010-04-23 21:23:10

回答

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

它看起來並不像你真正想要permutations。如果給出一個數組X = [1,2],則其排列正好是[1,2]和[2,1]。以你爲例,你希望它生成所有元組z,其中0 < = z < = X

這個元組列表問題很好地解決了polygenelubricants的解決方案。您所陳述的排列問題可以通過Fazal的解決方案來解決。

相關問題