如何使用递归打印具有n个整数的数组的所有可能顺序?

时间:2017-03-29 23:32:25

标签: java arrays recursion

例如,如果我有一个数组a = {1,2,6,10},它应该打印这4个数字的所有组合,应该有4个!总组合。一个由5个整数组成的数组总共有5个!组合。 (与以前的版本不同,因为我的参数数量必须保持不变。我不允许放入3个以上的参数。

数组a = {1,2,6,10}

{1,2,10,6}

{1,6,2,10}

{1,6,10,2}

{10,6,2,1}

我正在尝试使用Recursion来解决这个过程,任何想法如何?这是我现在的代码。任何有任何想法的人都可以帮助我吗?

static void permutations (int a[], int n, int p){
    if (p==n-1)
        return ;
    for (int i=p; i<n; i++){
        int b[]=new int [n];
        b[p]=a[i];
        for (int j=0; j<i; j++)
            b[j]=a[j];
            for (int k =i+1; k<n; k++)
                b[k]=a[k];    
        System.out.println(Arrays.toString(b));
        return permutations(b, n, p+1);  
    }         
}

1 个答案:

答案 0 :(得分:0)

解决问题的最佳方法是在代数中使用Permutations概念,它是获取集合的所有可能组合的非常有用的方法。

你应该知道解决这个问题的可能性:

此集{1, 2, 6, 10}元素1中的

具有 k-Permutations ,即3

这个排列是:{2, 1, 6, 10},{6, 2, 1, 10},{10, 2, 6, 1}

元素2还有 k-Permutations ,即2

2排列为:{1, 6, 2, 10},{1, 10, 6, 2}

元素6有一个 k-Permutations ,即1

6排列为:{1, 2, 10, 6}

最后是集合中所有元素的总可能排列:3 * 2 * 1 = 6

打印所有可能的排列的简单算法:

   int[] num = {1,2,6,10}; 
   int[] a = num.clone();
   ArrayList<String> combs = new ArrayList<String>();
   int temp;
    for(int i=0; i < num.length-1; i++){
        for(int j=i+1; j < num.length; j++){
             temp = a[i];
             a[i] = a[j];
             a[j] = temp;
            String obj = Arrays.toString(a);
            if(!combs.contains(obj)){
               combs.add(obj);
            }
             a = num.clone();  
        }
    }
    System.out.println("All possible order Combinations:");
    for(String obj : combs){
        System.out.println(obj);
    }

<强>输出:

All possible order Combinations:
[2, 1, 6, 10]
[6, 2, 1, 10]
[10, 2, 6, 1]
[1, 6, 2, 10]
[1, 10, 6, 2]
[1, 2, 10, 6]
希望这会有所帮助。