2016-05-03 2 views
1

Я хочу напечатать все подмножества сгенерированных массивов рекурсивно в основном методе.Печатать все подмножества массива рекурсивно

Следующие строки показывают мой код. Я не знаю, как реализовать подмножества методов() рекурсивно.

public class Main { 

    // Make random array with length n 
    public static int[] example(int n) { 
     Random rand = new Random(); 
     int[] example = new int[n + 1]; 
     for (int i = 1; i <= n; i++) { 
      example[i] = rand.nextInt(100); 
     } 
     Arrays.sort(example, 1, n + 1); 
     return example; 
    } 

    // Copy content of a boolean[] array into another boolean[] array 
    public static boolean[] copy(boolean[] elements, int n) { 
     boolean[] copyof = new boolean[n + 1]; 
     for (int i = 1; i <= n; i++) { 
      copyof[i] = elements[i]; 
     } 

     return copyof; 
    } 

    // Counts all subsets from 'set' 
    public static void subsets(int[] set, boolean[] includes, int k, int n) { 

     // recursive algo needed here! 

    } 

    public static void main(String[] args) { 
     // index starts with 1, -1 is just a placeholder. 
     int[] setA = {-1, 1, 2, 3, 4}; 
     boolean[] includesA = new boolean[5]; 
     subsets(setA, includesA, 1, 4); 

    } 

} 
+0

«Подмножества» могут быть немного неоднозначными. Учитывая массив '[1,2,3,4]', какие «подмножества» вы ожидали бы? –

+1

Вы можете захотеть и реализовать 'subsets()' нерекурсивно (т. Е. Реализовать его для _one_ subset), а затем подумать о том, что должен делать рекурсивный вызов (как вы определяете подмножества, являются ли они перестановками?) И сообщать нам. В этом процессе вы могли бы понять, как реализовать рекурсию самостоятельно. – Thomas

+1

@tobias_k как здесь {}, {1}, {2}, {3}, {4}, {1,2}, {2,3}, {3,4}, {1,2,3}, {2,3,4}, {1,2,3,4} – herrh

ответ

0

Если вы хотите использовать стороннюю библиотеку, класс Guava Sets может предоставить вам все возможные подмножества. Выезд the powersets method.

+0

Это не вариант в этом случае. – herrh

+0

Ссылка не работает. –

+0

Спасибо. Исправлена ​​ссылка. – TheEllis

0

Вот нерекурсивен техник:

public List<Set<Integer>> getSubsets(Set<Integer> set) { 
    List<Set<Integer>> subsets = new ArrayList<>(); 

    int numSubsets = 1 << set.size(); // 2 to the power of the initial set size 

    for (int i = 0; i < numSubsets; i++) { 
     Set<Integer> subset = new HashSet<>(); 
     for (int j = 0; j < set.size(); j++) { 
      //If the jth bit in i is 1 
      if ((i & (1 << j)) == 1) { 
       subset.add(set.get(i)); 
      } 
     } 
     subsets.add(subset); 
    } 
    return subsets; 
} 

Если вы хотите только уникальные (и обычно неупорядоченный) подмножеств, использовать Set<Set<Integer>> вместо List<Set<Integer>>.