1. 순열
arr = [1, 2, 3]
used = [False] * len(arr)
def perm(arr, r):
for i in range(len(arr)):
if not used[i]:
used[i] = True
if r == 1:
yield [arr[i]]
else:
for nxt in perm(arr, r-1):
yield [arr[i]] + nxt
used[i] = False
print(*perm(arr, 3), sep="\n")
2. 조합
arr = [1, 2, 3]
def combi(arr, r):
for i in range(len(arr)):
if r == 1:
yield [arr[i]]
else:
for nxt in combi(arr[i+1:], r-1):
yield [arr[i]] + nxt
print(*combi(arr, 3), sep="\n")
3. 중복순열
arr = [1, 2, 3]
def perm_with_repetition(arr, r):
for i in range(len(arr)):
if r == 1:
yield [arr[i]]
else:
for nxt in perm_with_repetition(arr, r-1):
yield [arr[i]] + nxt
print(*perm_with_repetition(arr, 3), sep="\n")
4. 중복조합
arr = [1, 2, 3]
def combi_with_repetition(arr, r):
for i in range(len(arr)):
if r == 1:
yield [arr[i]]
else:
for nxt in combi_with_repetition(arr[i:], r-1):
yield [arr[i]] + nxt
print(*combi_with_repetition(arr, 3), sep="\n")