全排列(字典序和非字典序)

非字典序全排列和字典序全排列python代码。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
# 全排列函数permutation,需要使用递归来列举,也是一个知识点(参考网络)
# 除了使用模块,当然可以自己写一个函数来实现:
#下面是字典序
def permutation(xs): #简化问题,假定形参xs是列表
if len(xs) == 0 or len(xs) == 1:
return [xs]
result = []
for i in xs:
temp_list = xs[:] #对xs进行切片操作,使得temp_list的值和xs一样 但是temp_list的改变不影响xs
temp_list.remove(i)
temp = permutation(temp_list) #使用递归 生成删掉一个元素的xs的全排列
for j in temp: #对temp中的每一项再进行遍历
j.insert(0,i) #j[0:0] = [i]在index 0 的位置插入之前删去的i
result.append(j)
return result

for i in permutation([1,2,3,4]):
print(i)

#下面是非字典序排列
li=[1,2,3,4]
res=[]
def Perm(m):#交换序
global li
if m==len(li)-1 :
res.append(li)
else:
for j in range(m,len(li)):
li[j],li[m]=li[m],li[j]
Perm(m+1)
li=li[:]
li[j],li[m]=li[m],li[j]
Perm(0)
for i in res:
print(i)
'''
当用[:]赋值时,生成的是一个新的对象,改变时不会改变之前的值,是深拷贝
'''