回溯法 关键字: 穷举先序 实质 实质上是一个先序遍历一颗状态树的过程.但是这棵树不是事先建立好的,而是在遍历过程中产生的. 求n个元素集合的子集 def subset(S:list): def backtrack(S:list, sub:set, i): """ @S:集合 @sub:子集, 记录单个 """ # base case if i == len(S): # 已经遍历叶子结点 print(sub) return # making progress else: # 选择该元素 sub.append(S[i]) backtrack(S, sub, i + 1) # # 不选择该元素 sub.remove(S[i]) backtrack(S, sub, i + 1) backtrack(S, [], 0) subset([1, 2]) [1, 2] [1] [2] [] 全排列问题 def permute(S:list): def backtrack(S:list, case:list): # base case if len(case) == len(S): #满了 print(case) return else: for elem in S: if elem in case: continue case.append(elem) backtrack(S, case) case.remove(elem) backtrack(S,[]) permute([1, 2, 3]) [1, 2, 3] [1, 3, 2] [2, 1, 3] [2, 3, 1] [3, 1, 2] [3, 2, 1]