---
# System prepended metadata

title: Composition & Permutation
tags: [Recursion]

---

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