2014-12-02 47 views
0

我正在尝试创建数字列表的所有可能数字组合的子集。下面是一个例子:无法定义循环算法

标记列表:1,2,3,4,5,6

亚群(3个中的编号):

1,2,3

1,2,4

1,2,5-

1,2,6

1,3,4

1,3,5-

1,3,6-

1,4,5

1,4,6-

1,5,6

2, 3,4

2,3,5

2,3,6

2,4,5-

2,4,6-

2,5,6-

3,4,5-

3,4,6-

3 ,5,6

4,5,6

我很难试图确定实现这个列表的循环算法。我可以看到我需要一个嵌套循环,但逻辑逃避我。这个例子包含所有可能的3个数字组,但仅仅是一个例子。我需要能够扩展到更大的列表和更多的组。请帮忙!

我是一个Java迷,所以我会很感激Java解决方案,但会很满意任何语言的解释甚至伪代码。

+0

做,做的次数事情的顺序,或与'5,2,3'相同吗? – 2014-12-02 16:41:34

+0

欢迎来到stackoverflow!一般来说,尝试自己开始就会获得更好的结果,然后如果您遇到问题,请发布迄今为止的代码。这里的人们通常不想为人们编写新的代码。 – Brian 2014-12-02 16:42:36

+0

幸运的是,Eric Lippert最近写了一篇关于做这件事的优秀系列! [制作组合(第1部分,共5部分)](http://ericlippert.com/2014/10/13/producing-combinations-part-one/)。他使用C#,但这些想法应该传递给Java。 – kaveman 2014-12-02 16:44:34

回答

1

我写了一个递归码 -

public class SubSetsOfLengthK { 
    public static void main(String[] args) { 
    int n = 6; 
    int k = 3; 

    int[] arr = new int[k]; 
    printSubSets(1,n,k,arr,0); 
} 

/* 
    Method prints all the subsets of length k of set (1.....n) 
*/ 
private static void printSubSets(int start, int n, int k, int[] arr, int pos) { 
    if(k==0) { 
     for(int a : arr) { 
      System.out.print(a+" "); 
     } 
     System.out.println(); 
     return; 
    } 

    for(int j=start;j<= n;j++) { 
     arr[pos] = j; 
     printSubSets(j+1,n,k-1, arr, pos+1); 
    } 
    } 
} 

要快速访问,你可以在这里看看,你要排列或组合,即https://coderpad.io/2R9CAG47