试图在没有递归的情况下显示所有排列

时间:2014-04-02 19:12:38

标签: java

我试图在不使用递归的情况下显示所有组合。 我试着用循环但是它没有工作。

没有递归(不工作):

import java.util.Arrays;

public class Combination {
    public static void main(String[] args) {
        String[] arr = {"A","B","C","D","E","F"};
        String[] result = new String[3];
        int i = 0, len = 3;
        while(len != 0 || i <= arr.length-len) 
        {
            result[result.length - len] = arr[i];
            len--;
            i++;          
        }

        if (len == 0){
            System.out.println(Arrays.toString(result));
            return;
        }
    }    
}  

使用递归(工作):

import java.util.Arrays;

public class Combination {
    public static void main(String[] args){
        String[] arr = {"A","B","C","D","E","F"};
        combinations2(arr, 3, 0, new String[3]);
    }

    static void combinations2(String[] arr, int len, int startPosition, String[] result){
        if (len == 0){
            System.out.println(Arrays.toString(result));
            return;
        }       
        for (int i = startPosition; i <= arr.length-len; i++){
            result[result.length - len] = arr[i];
            combinations2(arr, len-1, i+1, result);
        }
    }       
}

我做错了什么?

2 个答案:

答案 0 :(得分:1)

目前尚不清楚你想要得到的答案是什么。应该使用示例数据设置问题,以准确指定您想要获得的内容。鉴于您提供的计划的一部分。我想你要找的是所有可能的子集。

以下代码将为您提供所有可能的子集。您可以轻松修改此程序,为您提供所有可能的特定大小的子集(尝试它以确保您了解它的工作原理)。

static void subsets(String[]arr) {
    int len = arr.length;
    for (int i = 0; i < (1 << len); i++) { // 1 << len means 2 ^ len there are 2 ^ n subsets for a set of size n
        /* 
         * We will use the bits of the integer i to represent which elements are taken
         * a bit of value 1 means this element is included in the current subset
         * a bit of value 0 means that we do not take the element in the given position
         */
        String res = "[";
        for(int j = 0; j < len; j++) { //loop over the bits of i from 0 to len -1
            if ( (i & (1 << j)) != 0) { 
                //the jth bit is 1 in the integer i as such the jth 
                //element is taken in the current subset
                res += (arr[j]+", ");   
            }
        }
        res += "]";
        int lastCommaPosition = res.lastIndexOf(',');
        if (res.lastIndexOf(',') != -1) { // a comma exists
            res = res.substring(0, lastCommaPosition)+ "]";//remove the extra comma and space
        }
        System.out.println(res);
    }
}

您可以修改上面的方法以获取整数大小,例如,如果此计数等于您打印的大小,则计算值1的位数(所采用的元素数),否则您不会。如果这不是您想要的答案,请随意修改问题,或者如果您不理解某些内容,请在评论中提出。

答案 1 :(得分:-1)

以下是如何在没有递归的情况下获得准确的输出。我正在使用for循环:

    for(int i = 0; i < arr.length - 2; i ++) {
        for(int j = i + 1; j < arr.length - 1; j++ ) {
            for(int k = j + 1; k < arr.length ; k++ ) {
                System.out.println(arr[i] + ", " + arr[j] + ", " + arr[k]);
            }
        }
    }