Я думаю, что это немного сбивает меня с толку, потому что я никогда особо не использовал Java-наборы. Не мог бы кто-нибудь попытаться показать мне (желательно, объяснив, как постепенно создается powerset) в следующем коде (ps я получил этот код из сообщения в stackoverflow, поэтому честь принадлежит этому человеку):
public static void main(String[] args) {
Set<Integer> mySet = new HashSet<Integer>();
mySet.add(1);
mySet.add(2);
mySet.add(3);
for (Set<Integer> s : powerSet(mySet)) {
System.out.println(s);
}
}
public static <T> Set<Set<T>> powerSet(Set<T> originalSet) {
Set<Set<T>> sets = new HashSet<Set<T>>();
//If the input is empty, add the empty set and return
if (originalSet.isEmpty()) {
sets.add(new HashSet<T>());
return sets;
}
//Put the originalSet into an arraylist
List<T> list = new ArrayList<T>(originalSet);
//Get the first element
T head = list.get(0);
//Get everything but the first element and put into a set
Set<T> rest = new HashSet<T>(list.subList(1, list.size()));
//For each element in the set above
for (Set<T> set : powerSet(rest)) {
//Create a new set
Set<T> newSet = new HashSet<T>();
//Add the head
newSet.add(head);
//Add the rest
newSet.addAll(set);
//Add all of newset to the result
sets.add(newSet);
//Add the current element
sets.add(set);
}
return sets;
}
for each element in the set above
должен бытьfor each subset of the rest set
. Если 1 является первым элементом, то рекурсивный вызов генерирует набор мощности {2,3}, то есть наборы {2,3}, {2}, {3}, {}. Затем цикл принимает каждый из них, излучает его либо с 1, либо без него. - person hmakholm left over Monica   schedule 30.08.2011