排列组合
一、递归
1、自己调用自己
2、找到一个退出的条件
二、全排列:针对给定的一组数据,给出包含所有数据的排列的组合
1:1
1,2:[[1,2],[2,1]]
1,2,3:【【1,2,3】,【1,3,2】,【2,1,3】,
【2,3,1】,【3,2,1】,【3,1,2】】
三、1,2,3 的全排列 --》[2,3]-》[2]
规律:以1开头的[2,3]的全排列 + 以2开头的[1,3]的全排列 + 以3开头的[1,2]的全排列
-》
以1开头的(以2开头的[3]的全排列+以3开头的[2]的全排列)的全排列 + 以2开头的(以1开头的[3]的全排列+以3开头的[1]的全排列)的全排列 + 以3开头的(以1开头的[2]的全排列+以2开头的[1]的全排列)的全排列
习题2:当只有一个数时,他的全排列的个数是几?
答案:1
[2] ->[[2]]
[2,3] -》[[2,3],[3,2]]
表示全排列的时候,我们习惯使用列表来表示
四、全排列算法:
求n个数的全排列:
1、遍历的抽取每一个数出来,求剩下n-1个数的全排列
2、针对n-1个数的全排列,抽取一个数出来,求剩下的n-2个数的全排列
3、循环上述的步骤,直到数字个数变成1,满足递归的退出条件。
4、把上面所有的全排列求和,则是最终的全排列。
算法实现:
# encoding=utf-8 def perm(listVar): if len(listVar) == 1: return [listVar] retlist = [] for i in xrange(len(listVar)): #得到一个新的列表,列表中去掉了i指向的元素 restList = listVar[:i] + listVar[i+1:] # 1 #perm([2,3])-> [[2,3],[3,2]] #1 加到 perm(2,3) 的结果中去 perResult = perm(restList) for x in perResult: #习题:此行代码是否可以这样写,为何? # retlist.append(listVar[i]+x) retlist.append(listVar[i:i+1]+x) return retlist if __name__ == '__main__': print perm([1,2,3])