1、定义
从n个数中选取m(m<=n)个数按照一定的顺序排成一个序列,叫做n个元素的子排列。由排列的定义可见,不同的顺序显然是一个不同的排列。从n个元素中选取n个元素的一个排列,称为一个全排列。全排列的排列数为n!个。
2、算法思想
这个问题很适合用递归解决(当然也可以用非递归实现),使用递归关键是要找到问题中的基线条件(base case)和递归条件(recyrsive case)。递归条件指的是函数调用自己,而基线条件泽指的是函数不再调用自己,从而避免无限循环。那么如何来找这两个条件呢?
从我们自己手写一个序列[1,2,3,4]的全排列着手,想的是先写好开头是1的全排列,然后是开头分别为2,3,4的全排列。在开头为1的全排列中,我们又可以按照以上思路写出序列[2,3,4]的全排列。从编程的角度来说,当我们写完开头为1的全排列后,将1与2交换位置即可再次排序,一直到和4交换排序完为止。随着不断的深入,我们需要知道每一轮排序需要交换几次,于是指定一个变量n记录进入的层次。
于是,基线条件就是已经待排列的自序列只剩一个,即深入到最后一层,也就是n == size - 1(序列下表从0开始,所以减去1)。递归条件就是n < size -1 。
3、代码实现
def swap(a1,a2):
return a2,a1
def permutate(array,size,n):
'''
array: 输入序列
size : 序列长度
n : 目前进入到第几层
'''
if n == size-1:
print array
else:
for i in range(n,size): #每深入一层,待排序的自序列就少一个,需要交换的循环次数就少一次
array[n],array[i] = swap(array[n],array[i])
permutate(array,size,n+1)
array[n],array[i] = swap(array[n],array[i])
if __name__ == '__main__':
a = [1,2,3,4]
permutate(a,len(a),0)
输出结果: