Вы можете использовать функцию, которая перебирает индекс от заданного начального номера, по умолчанию от 1
до n
, возвращает диапазон чисел от начального номера до индекса и рекурсивно соединяет подмножества из рекурсивного вызов с начальным индексом, равным одному большему и меньшему подмножеству, до тех пор, пока начальный индекс не станет больше, чем n
или k
не станет 1
, после чего должен быть получен оставшийся диапазон:
def get_subsets(n, k, s=1):
if s > n or k == 1:
yield [list(range(s, n + 1))] + [[] for _ in range(1, k)]
return
for i in range(s, n + 1):
for subsets in get_subsets(n, k - 1, i + 1):
yield [list(range(s, i + 1))] + subsets
так что:
for s in get_subsets(4, 2):
print(*s)
выходы:
[1] [2, 3, 4]
[1, 2] [3, 4]
[1, 2, 3] [4]
[1, 2, 3, 4] []
и это:
for s in get_subsets(4, 3):
print(*s)
выходы:
[1] [2] [3, 4]
[1] [2, 3] [4]
[1] [2, 3, 4] []
[1, 2] [3] [4]
[1, 2] [3, 4] []
[1, 2, 3] [4] []
[1, 2, 3, 4] [] []