python递归实现全排列函数(代码+解析)


一、递归

1.思路

对于一个有n个元素的列表,其所有的全排列可以分为n类,其中第i类中包括以i开头的序列。比如说,对于序列【1,2,3】来说,他的全排列可以分为3类,第1类包括【1,2,3】【1,3,2】;第2类包括【2,1,3】【2,3,1】;第3类包括【3,1,2】【3,2,1】。不难看出,每类中除了固定的第一个元素,其后所有元素是对除第一个值之外的n-1个元素进行全排列。
由此可见,对于一个有n个元素的列表,其所有的全排列可以这样求出:对所有元素,依次将其放在第一个固定,然后对剩下的n-1个元素进行全排列,直到所有元素都被固定,需要排列的元素个数为1,其全排列就是它自己。从这里可以看出,全排列可以通过递归实现。

2.代码及解析

qpl()函数传入begin这个参数,是本次调用函数需要排列的头指针(下标),也可以看作是前面已固定的元素个数,使用时一般为0.参数n为需要排序的列表。
源码如下:

def qpl(n,begin):#n是需要排序的列表,begin是本次需要排列的头指针(下标),也可以看作是前面已固定的元素个数
    end=len(n)#记录元素个数
    if begin==end: #递归的结束条件,全部都已固定,可以输出
        print(n)
    else:
        i=begin #指向本次需要排列的第一个位置(本轮需要固定的位置
    for num in range(begin,end):#num遍历本次需要排列的序列中的每一个数,
        n[num],n[i]=n[i],n[num]#依次把这些数放在固定的位置上,方法是交换
        qpl(n,begin+1) #不看那个已经固定的数
        n[num],n[i]=n[i],n[num] #回溯,回到上一步,再进行下一次for循环

n=[1,2,3]
qpl(n,0)

输出结果为:

[1, 2, 3]
[1, 3, 2]
[2, 1, 3]
[2, 3, 1]
[3, 2, 1]
[3, 1, 2]

二、引用标准库函数

这个比较简单不多赘述,但itertools库真的好用!!

import itertools
print(list(itertools.permutations([1,2,3],3)))
  • 8
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值