---
# System prepended metadata

title: Problem 3-1
tags: [week7, answer]

---

# Problem 3-1
###### tags: `week7` `answer`
# permutation
```python=1
def permutation(lst):
    if len(lst) == 0: 
        return []
    if len(lst) == 1: 
        return [lst]
    l = []
    for i in range(len(lst)): 
       m = lst[i] #簡單來說，依序選定一個值（10、20...)
       remLst = lst[:i] + lst[i+1:] #除了剛剛選的以外的list
       for p in permutation(remLst): #先排列剛剛存的list(remLst)
           l.append([m] + p) #把剛才每個排列出的都在最前面加上m
    return l 
n = input()
alist = sorted(input().split(' '))
for p in permutation(alist): 
    print(p)
```
```python=1
def permutation2(l,p=[]):#l:現在要排列的數字;p:已經排列過的數字
    #l.sort()
    for i in (l2:=l.copy()):#複製一份l，並在l2中依序選一個數字
        p2=p.copy()
        p2.extend([i])
        if len(l2)>1 and i<len(l2)-1:
            l2.remove(i)
            permutation2(l2,p2)#l2,p2傳進函數
        elif len(l2)>1:permutation2(l[:i],p2)
        else:
            for i in p2:print(i,end=' ')
            print('')
n=int(input())
l=sorted([int(x) for x in input().split()])
```
```python1
#概念基本上跟前一種一樣，只是把已經選過的數字用*d來存
def permutation(n,l,*d):
    l.sort()
    for i in l:
        if n>1:
            l2=l.copy()
            l2.remove(i)
            permutation(n-1,l2,*d,i)
        else:print(*d,i)
n=int(input())
l=sorted([int(x) for x in input().split()])
```

> recursion版本
```python=
N = int(input())
numbers = [int(x) for x in input().split()]
final = [numbers]

def rec(myList, n):
    global final
    temp_list = []
    if n == 2:
        newList = [myList[1], myList[0]]
        return [newList]  # len(newList = 2)
    else:
        newList = [myList]
        for i in range(n):
            myList[0], myList[i] = myList[i], myList[0]
            subList = rec(myList[1:].copy(), n-1)
            newList.append([myList[0], *myList[1:]])
            for j in range(len(subList)):
                x = [myList[0], *subList[j]]
                newList.append(x)
        if len(newList[0]) == N:
            final.extend(newList)
        return newList
if N > 2:
    a = rec(numbers.copy(), N)
    for i in range(len(final)):
        final[i] = tuple(final[i])
    finalset = set(final)
    fin = sorted(finalset, key = lambda x: [x[i] for i in range(N)])

    for x in fin:
        print(*x, sep=' ')
elif N == 2:
    numbers.sort()
    print(*numbers, sep = ' ')
    numbers.sort(reverse=True)
    print(*numbers, sep = ' ')
else:
    print(numbers[0])
```