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

2020-03-07  本文已影响0人  安哥拉的赞礼
# 全排列函数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)
'''
当用[:]赋值时,生成的是一个新的对象,改变时不会改变之前的值,是深拷贝
'''
上一篇 下一篇

猜你喜欢

热点阅读