---
# System prepended metadata

title: 順列生成の実装
tags: [競プロ]

---

###### tags: `競プロ`

# 順列生成の実装

```python=
import sys
from copy import deepcopy

def perm(head :list ,rest :list,result :list):
    if len(rest) == 0:
        # restを消費仕切ったら、結果に渡してあげる
        result.append(head)
        return 
    for r in rest:
        # restからひとつ削ったrestxを生成
        restx = deepcopy(rest)
        restx.remove(r)

        # head に restから取り出した値を追加する
        headx = deepcopy(head)
        headx.append(r)

        perm(headx,restx,result)

def main():
    N = int(input())
    # 結果用のリストを渡さないといけない
    res = []
    perm([],[i for i in range(1,N+1)],res)

    # こうしたい
    res = perm([],[i for i in range(1,N+1)])

    print(res)

if __name__ == '__main__':
    main()
```


Hackyな方法としてはこんなのを一つ

```python
import sys
from copy import deepcopy

def _perm(head: list, rest: list, result: list):
    if len(rest) == 0:
        # restを消費仕切ったら、結果に渡してあげる
        result.append(head)
        return 
    for r in rest:
        # restからひとつ削ったrestxを生成
        restx = deepcopy(rest)
        restx.remove(r)

        # head に restから取り出した値を追加する
        headx = deepcopy(head)
        headx.append(r)

        _perm(headx,restx,result)
        
# サブっぽい関数に全部任せる
def perm(source: list) -> list:
    res = []
    _perm([], source, res)
    return res

def main():
    N = int(input())

    res = perm(list(range(1,N+1)))
    print(res)

if __name__ == '__main__':
    main()

```