去年寫不出全排列,今天終於完成,前來還願
非重複排列
使用分治遞歸,按位逐層交換,記錄底層交換結果,恢復交換並返回
def swap(s, i1, i2):
if i1 < len(s) and i2 < len(s):
s[i1], s[i2] = s[i2], s[i1]
def arrange(s, begin, end):
if begin == end:
print(s)
return
for i in range(begin, end):
swap(s, begin, i)
arrange(s, begin + 1, end)
swap(s, begin, i)
s = [x for x in 'abcd']
arrange(s, 0, len(s))
重複排列
使用進制原理,迭代取餘映射,記錄映射結果
import numpy as np
def cumdivision(i, base, n):
arr = []
while i > 0:
arr.append(i % base)
i = i // base
arr.extend([0] * (n - len(arr)))
return arr[::-1]
def arrange(s, n):
base = len(s)
for i in range(pow(base, n)):
arr = cumdivision(i, base, n)
print(np.array(s)[arr])
s = [x for x in 'abcd']
arrange(s, 4)