[笔记] Python实现全排列算法

所谓全排列,就是给定数组,将所有的可能排列组合都枚举出来,n个元素共有n!种排列组合。

举例,对于['1', '2', '3'],全排列结果为:123,132,213,231,312,321,共有3!=6种。

很直觉的思路就是从数组中依次挑选一个元素作为第1元素,固定第1元素之后,再将剩下的n-1个元素做全排列。

很显然这是递归的思路,还需要确定跳出条件,这里是只剩下1个元素时,自然就到头了。

根据这个思路,代码如下:

from __future__ import print_function

def perm(elem_list, s=''):
    # 类型检查
    if type(elem_list) != type([]):
        return

    # 参数合法性检查
    if len(elem_list) == 0:
        return

    # 跳出条件
    if len(elem_list) == 1:
        # 打印当前结果
        print(s+elem_list[0])
        return

    # 依次挑选一个元素作为第1元素
    for i,e in enumerate(elem_list):
        # 递归调用自身,同时传入当前的前缀字符串
        perm(elem_list[:i] + elem_list[i+1:], s+e)


# 测试用例
perm(['1', '2', '3'])

上述代码的运行结果如下:

123
132
213
231
312
321
posted @ 2019-02-22 00:28  ET民工[源自火星]  阅读(5726)  评论(0编辑  收藏  举报