去年写不出全排列,今天终于完成,前来还愿
非重复排列
使用分治递归,按位逐层交换,记录底层交换结果,恢复交换并返回
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)