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


文章目录

  • 一、递归
    • 1.思路
    • 2.代码及解析
  • 二、引用标准库函数

一、递归 1.思路 【python|python递归实现全排列函数(代码+解析)】对于一个有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)))

    推荐阅读