2010-04-19 43 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的解决方案来解决。

相关问题