#coding:utf-8
__author__ = 'similarface'
'''
序列的排列组合
'''
def permute(list):
'''
序列的排列数: abc=abc,acb,bac,aca,cab,cba
:param list:
:return:
'''
#接受任何序列
if not list:
#返回空序列
return [list]
else:
res=[]
for i in range(len(list)):
#删除当前节点
rest=list[:i]+list[i+1:]
#排列其他的节点
for x in permute(rest):
#把当前节点添加到前面
res.append(list[i:i+1]+x)
return res
def subset(list, size):
'''
子排列
:param list:
:param size:
:return:
'''
if size == 0 or not list:
return [list[:0]]
else:
result=[]
for i in range(len(list)):
pick = list[i:i+1]
rest = list[:i] + list[i+1:]
for x in subset(rest, size-1):
result.append(pick + x)
return result
def combo(list, size):
'''
组合数
:param list:
:param size:
:return:
'''
if size == 0 or not list:
return [list[:0]]
else:
result = []
for i in range(0, (len(list) - size) + 1):
#重i出截断
pick = list[i:i+1]
rest = list[i+1:]
#截断位置后的list继续组合
for x in combo(rest, size - 1):
result.append(pick + x)
return result
if __name__=="__main__":
print(permute([1,2,3]))
print(permute('abc'))
print(combo('abc', 2))
print(subset([1, 2, 3], 2))
'''
[[1, 2, 3], [1, 3, 2], [2, 1, 3], [2, 3, 1], [3, 1, 2], [3, 2, 1]]
['abc', 'acb', 'bac', 'bca', 'cab', 'cba']
['ab', 'ac', 'bc']
[[1, 2], [1, 3], [2, 1], [2, 3], [3, 1], [3, 2]]
'''