Поскольку вы говорите «математический набор», я предполагаю, что вы имеете в виду, что нет дубликатов.
наивная реализация, которая работает до 32 элементов:
my $set = [1,2,3];
my @subsets;
for my $count (1..(1<<@$set)-2) {
push @subsets, [ map $count & (1<<$_) ? $set->[$_] :(), 0..$#$set ];
}
(Для полного спектра подмножеств, цикл от 0 до (1 < < @ $ набор) -1, за исключением 0 исключает нуль (1 < < @ $ set) -1 исключает исходный комплект.)
Обновление: Я не рекомендую это использовать модуль, просто предлагая его на случай, если вы хотите понять, как это сделать такая проблема. В общем, каждый элемент либо включен, либо исключен из любого данного подмножества. Вы хотите выбрать элемент и сгенерировать сначала все возможные подмножества других элементов, не включая выбранный вами элемент, а затем все возможные подмножества других элементов, включая выбранный вами элемент. Рекурсивно применяйте это к «генерации всех возможных подмножеств». Наконец, отбросьте нулевое подмножество и неправильное подмножество. В приведенном выше коде каждому элементу присваивается бит. Сначала все подмножества генерируются с высоким битом, а затем все с отключенным. Для каждой из этих альтернатив подмножества генерируются сначала с выключенным рядом с самым высоким, а затем. Продолжая это, пока вы просто не работаете над самым низким битом, все, что у вас получается, - это все возможные числа в порядке.
Из примера, я предполагаю, что он хочет правильные подмножества. – ysth