wanlifeipeng

  博客园 :: 首页 :: 博问 :: 闪存 :: :: 联系 :: 订阅 订阅 :: 管理 ::

step 1: 列表的全排列:

这个版本比较low

def permutation(li,index):
    for i in range(index,len(li)):
        if index == len(li)-1:
            print(li)
            return
        tmp = li[index]
        li[index] = li[i]
        li[i] = tmp
        permutation(li,index+1)
        tmp = li[index]
        li[index] = li[i]
        li[i] = tmp

调用:

permutation([1,2,3,4],0)

step2: 字符串的全排列:

def permutation(str):
    li = list(str)
    cnt = 0  #记录全排列的总数
    def permutation_list(index):
        if index == len(li) -1:
            nonlocal cnt
            cnt += 1
            print(li)
        for i in range(index,len(li)):
            li[index],li[i] = li[i],li[index]
            permutation_list(index+1)
            li[index], li[i] = li[i], li[index]

    ret = permutation_list(0)
    print("共有%d中全排列" % cnt)
    return ret

备注:

在闭包中,内部函数依然维持了外部函数中自由变量的引用—单元。内部函数不能修改单元对象的值(但是可以引用)。若尝试修改,则解释器会认为它是局部变量。这类似于全局变量和局部变量的关系。如果在函数内部修改全局变量,必须加上global声明,但是对于自由变量,尚没有类似的机制。所以,只能使用列表。(python3中引入了关键字:nonlocal)

测试:

permutation('abcd')

['a', 'b', 'c', 'd']
['a', 'b', 'd', 'c']
['a', 'c', 'b', 'd']
['a', 'c', 'd', 'b']
['a', 'd', 'c', 'b']
['a', 'd', 'b', 'c']
['b', 'a', 'c', 'd']
['b', 'a', 'd', 'c']
['b', 'c', 'a', 'd']
['b', 'c', 'd', 'a']
['b', 'd', 'c', 'a']
['b', 'd', 'a', 'c']
['c', 'b', 'a', 'd']
['c', 'b', 'd', 'a']
['c', 'a', 'b', 'd']
['c', 'a', 'd', 'b']
['c', 'd', 'a', 'b']
['c', 'd', 'b', 'a']
['d', 'b', 'c', 'a']
['d', 'b', 'a', 'c']
['d', 'c', 'b', 'a']
['d', 'c', 'a', 'b']
['d', 'a', 'c', 'b']
['d', 'a', 'b', 'c']
共有24中全排列

 

step3 : 使用python标准库

import itertools
t = list(itertools.permutations([1,2,3,4]))
print(t)

可以指定排列的位数:

import itertools
t = itertools.permutations([1,2,3,4],3) #只排列3位

 

posted on 2017-04-08 11:30  wanlifeipeng  阅读(160)  评论(0编辑  收藏  举报