# Composition & Permutation ###### tags: `Recursion` ## C(n,k) ```python=1 def Comb(arrs, d, k, s, result): # d 表示搜尋深度,k 是設定的最大深度,即 C(n, k)中需要選取的個數 if d == k: print(result) return for i in range(s, len(arrs)): result.append(arrs[i]) Comb(arrs, d+1, k, i+1, result) result.pop() arrs = [1, 2, 3, 4] Comb(arrs, 0, 3, 0, []) ``` ## P(n,k) ```python=1 def Perm_k(arrs, k): # 若輸入 [1,2,3],則先取出1這個元素,將剩餘的 [2,3]中取出另一個元素得到 [[1,2],[1,3]] # 同理,取出2或者3時,得到的分別是 [[2,1],[2,3]]和 [[3,1],[3,2]] if len(arrs)==1: return [arrs] if k==1: return list(map(lambda s:[s], arrs)) # 當 k 為 1 時,每(單)個元素都可以被選取 result = [] # 最終的結果(即全排列的各種情況) for i in range(len(arrs)): rest_arrs = arrs[:i]+arrs[i+1:] # 取出arrs中的第 i個元素後剩餘的元素 rest_lists = Perm_k(rest_arrs, k-1) # 剩餘的元素選取 k-1元素 lists = [] for term in rest_lists: lists.append(arrs[i:i+1]+term) # 將取出的第 i個元素加到剩餘全排列的前面 result += lists return result print(Perm_k([1,2,3], 3)) ``` >[name=Pingju Hsieh]