Try рекурсивно думать:
- базовый случай) Powerset пустого множества является пустым множеством
- прн. случай) Powerset из списка, таких [
firstElemnt
] + restOfTheList
является Powerset из restOfTheList
плюс каждый элемент Powerset из restOfTheList
прикован с firstElemnt
Пример:
Учитывая список [а, Ь , с]:
- Powerset из [] -> [[]] (набор с пустым множеством)
- Powerset из [а] -> [[], [а]] (добавлено
a
к каждому элементу предыдущего Powerset)
- Powerset [а, Ь] -> [[], [а], [б], [а, Ь]] (добавлен
b
к каждому элементу предыдущего силового набора)
- набор команд [a, b, c] -> [[], [a], [b], [a, b], [c], [a, с], [а, б, в]] (добавлено
c
к каждому элементу предыдущего Powerset)
АЛГОРИТМ
public static List<List<String>> powerset(final LinkedList<String> originalSet) {
final List<List<String>> powerset = new LinkedList<List<String>>();
//Base case: empty set
if ((originalSet == null) || (originalSet.size() == 0)) {
final List<String> set = new ArrayList<String>();
//System.out.println(set);
powerset.add(set);
} else {
//Recursive case:
final String firstElement = originalSet.removeFirst();
final List<List<String>> prevPowerset = powerset(originalSet);
powerset.addAll(prevPowerset);
//Add firstElement to each of the set of the previuos powerset
for (final List<String> prevSet : prevPowerset) {
final List<String> newSet = new ArrayList<String>(prevSet);
newSet.add(firstElement);
//System.out.println(newSet);
powerset.add(newSet);
}
}
return powerset;
}
TEST
public static void main(final String[] args) {
final LinkedList<String> originalSet = new LinkedList<String>();
originalSet.add("a");
originalSet.add("b");
originalSet.add("c");
System.out.println("The powerset of " + originalSet + " is:");
System.out.println(powerset(originalSet));
}
ВЫВОД
The powerset of [a, b, c] is:
[[], [c], [b], [c, b], [a], [c, a], [b, a], [c, b, a]]
Обратите внимание, что я импортировал следующие классы:
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
Вы должны описать то, что ваш код в настоящее время делает. Включите ожидаемый и фактический вывод, если это применимо. Кроме того, у вас есть код после вашего (безусловного) оператора return, который никогда не действителен в Java (или там что-то еще странное происходит) - пожалуйста, укажите скомпилированный пример кода или, если вы спросите о ошибке компилятора, также включите эта ошибка или, если вы знаете, что код не будет работать, напишите псевдокод или описание высокого уровня вместо или в дополнение к фактическому коду. – Dukeling