Марк писал(а):
Есть массив из 8 элементов, необходимо вывести все возможные варианты комбинаций множеств этих элементов (т.е. все возможные комбинации с одним элементом, затем с двумя и т.д.).
Какие-то идеи реализации задачи подскажите?
Вам нужны подмножества, или их число (как-то сгруппированное)?
Если число, то ответ
(включая пустое множество).
Для решения этой задачи обычно применяют рекурсию, двукратным (или любым конечно-кратным) циклом с конечной памятью тут не отделаться.
e2e4 писал(а):
Простите, не могли бы вы пояснить суть понятия "факультет"?
Это факториал. Очевидно, что p(n, k) возвращает
.
Я по-прежнему в недоумении, какое это имеет отношение к задаче…
Напишу решение на Python, чтобы было нужно разобраться, что происходит:
Код:
def subsets(used, selected):
if used < len(raw):
subsets(used + 1, selected)
acc[selected] = raw[used]
subsets(used + 1, selected + 1)
else:
print acc[:selected]
if __name__ == "__main__":
raw = range(8)
acc = [None] * len(raw)
subsets(0, 0)
~~~~~~~~~~~~~~~~~~~~
Есть еще один вариант, более хулиганский. Для маленького массива, порядка восьми элементов, он проходит, но для больших может не хватить размерности целого. Впрочем, в этом случае и выводить слишком долго. Идея алгоритма — просто перебирать все целые числа и использовать из как битовую маску.
Код:
def subsets(raw):
acc = [None] * len(raw)
for bitmask in range(2**len(raw)):
k = 0
for j in range(len(raw)):
if bitmask & (1 << j):
acc[k] = raw[j]
k += 1
print acc[:k]
if __name__ == "__main__":
raw = range(8)
subsets(raw)
Обратите внимание: в этом случае нам acc фактически не нужен. Затратив чуть больше усилий на программирование, мы можем непосредственно печатать ответ.