#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]] '''