Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/358.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 给定一个整数数组[x0-x1-x2],如何计算从[0-0]到[x0-x1-x2]的所有可能置换?_Java_List_Integer_Arraylist_Permutation - Fatal编程技术网

Java 给定一个整数数组[x0-x1-x2],如何计算从[0-0]到[x0-x1-x2]的所有可能置换?

Java 给定一个整数数组[x0-x1-x2],如何计算从[0-0]到[x0-x1-x2]的所有可能置换?,java,list,integer,arraylist,permutation,Java,List,Integer,Arraylist,Permutation,我正在编写一个程序,它接受一个ArrayList,我需要计算所有可能的排列,从一个0列表开始,直到相应的输入列表中的值 有人知道如何迭代计算这些值吗 例如,给定[12]作为输入,它应该查找并存储以下列表: [0], [1 0], [1 1], [1 2], [0 1], [0 2] 谢谢 这是一个标准的递归生成器: import java.util.Arrays; //... static void generate(int... limits) { generate(new int

我正在编写一个程序,它接受一个ArrayList,我需要计算所有可能的排列,从一个0列表开始,直到相应的输入列表中的值

有人知道如何迭代计算这些值吗

例如,给定[12]作为输入,它应该查找并存储以下列表:

[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]
*/
它的工作原理与二进制算术(或任何基数)中增量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!)

看起来你并不是真的想要。如果给你一个数组X=[1,2],它的排列正好是[1,2]和[2,1]。根据您的示例,您希望它生成所有元组z,其中0听起来像是在要求“笛卡尔积”,其中每个轴由n个连续的非负整数组成。
 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!)