[笔记] 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

转载于:https://www.cnblogs.com/journeyonmyway/p/10416108.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值