一、递归
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)))