再帰構文を考える、ちょっとした手助け

# 前書き

プログラミング初心者がダラダラ喋ってるメモです〜

　
昨日たまたま数学の問題を出される機会があって
テキトーにプログラムを書いていたときのお話......

# お話
A「**問題！！0~9までの数字を並び替えた数はなん通りあるでしょう？ ！！**」
私「知らんて...」

ということで並べ替えを全通り書き出したかった私は、
とりあえず書き出してみたんですが...

私「今から書き出すから待っとけ！！！」
A「？？？？？？」

半ば呆れ顔でこちらを見ていたA君をよそに早速コードに取り掛かる、、

私「**これは、あの再帰構文やろ！！！**」
私「1つづつ固定して行けばええだけやな」
|1|2|3|4|5|6
|---|:-:|:-:|:-:|:-:|:-:|
|9|8|...|2|1|0|
||||2|0|1|
||||1|2|0|
||||1|0|2|

A「がんばえ〜<font color="ぬるぽ"><font color="white">（\*´ω｀\*）</font></font>」
私「ありがと〜。<font color="ｶﾞｯ"><font color="white">でもその顔文字は流行らないし流行らせない</font></font>」

...

私「まあ固定する文字とそれ以外の文字に分けて再帰させればいいよな」
私「多分こんな感じだろ」
```py
nums = ['a', 'b', 'c']
def export_all_sorts(nums_list: list) -> list:
  print('called')
  ans = []
  for i in range(len(nums_list)):

    if len(nums_list) == 0:
      return [[]]



    print('i:', i, 'in', len(nums_list), nums_list)
    copied_nums_list = nums_list[:]
    poped = copied_nums_list.pop(i)
    print(poped, copied_nums_list)

    result = export_all_sorts(copied_nums_list)
    print('result :', result)
    for n in result:
      n.append(poped)
    print('result :', result)
    ans.append(result)
  return ans

print('ans: ', export_all_sorts(nums))

# => [[[['b'], 'a'], [['c'], 'a']], [[['a'], 'b'], [['c'], 'b']], [[['a'], 'c'], [['b'], 'c']]]
```
<details open>
<summary>ログ</summary>

```
called
i: 0 in 3 ['a', 'b', 'c']
a ['b', 'c']
called
i: 0 in 2 ['b', 'c']
b ['c']
called
i: 0 in 1 ['c']
c []
called
result : []
result : []
result : [[]]
result : [['b']]
i: 1 in 2 ['b', 'c']
c ['b']
called
i: 0 in 1 ['b']
b []
called
result : []
result : []
result : [[]]
result : [['c']]
result : [[['b']], [['c']]]
result : [[['b'], 'a'], [['c'], 'a']]
i: 1 in 3 ['a', 'b', 'c']
b ['a', 'c']
called
i: 0 in 2 ['a', 'c']
a ['c']
called
i: 0 in 1 ['c']
c []
called
result : []
result : []
result : [[]]
result : [['a']]
i: 1 in 2 ['a', 'c']
c ['a']
called
i: 0 in 1 ['a']
a []
called
result : []
result : []
result : [[]]
result : [['c']]
result : [[['a']], [['c']]]
result : [[['a'], 'b'], [['c'], 'b']]
i: 2 in 3 ['a', 'b', 'c']
c ['a', 'b']
called
i: 0 in 2 ['a', 'b']
a ['b']
called
i: 0 in 1 ['b']
b []
called
result : []
result : []
result : [[]]
result : [['a']]
i: 1 in 2 ['a', 'b']
b ['a']
called
i: 0 in 1 ['a']
a []
called
result : []
result : []
result : [[]]
result : [['b']]
result : [[['a']], [['b']]]
result : [[['a'], 'c'], [['b'], 'c']]
ans:  [[[['b'], 'a'], [['c'], 'a']], [[['a'], 'b'], [['c'], 'b']], [[['a'], 'c'], [['b'], 'c']]]
```

</details>

私「ほげぇ... ふがぁぁ...（´・ω・`）」
A「ぴよぴよぉぉぉ＾＾」
私「もぅﾏﾁﾞ無理」
A「悠揚たれ」

　
私「ログ、読みにくいんだが」
A「なら、ログにもインデントを設けよう！！（本題）」
# ログにもインデントを設けよう！！

私「ログにインデント...？」
A「せや」
私「どうやって？」
A「引数に深さの値を追加して、プリントするときに`'|   '`を繰り返せばええで」
私「ほーん」

```py
nums = ['a', 'b', 'c']
def export_all_sorts(nums_list: list, recursion_depth: int = 0) -> list:

  debug_indent =  '|   ' * recursion_depth

  print(debug_indent, 'called')
  ans = []
  for i in range(len(nums_list)):

    if len(nums_list) == 0:
      return [[]]



    print(debug_indent, 'i:', i, 'in', len(nums_list), nums_list)
    copied_nums_list = nums_list[:]
    poped = copied_nums_list.pop(i)
    print(debug_indent, poped, copied_nums_list)

    result = export_all_sorts(copied_nums_list, recursion_depth + 1)
    print(debug_indent, 'result :', result)
    for n in result:
      n.append(poped)
    print(debug_indent, 'result :', result)
    ans.append(result)
  return ans

print('ans: ', export_all_sorts(nums))
```


<details open>
<summary>ログ</summary>

```
 called
 i: 0 in 3 ['a', 'b', 'c']
 a ['b', 'c']
|    called
|    i: 0 in 2 ['b', 'c']
|    b ['c']
|   |    called
|   |    i: 0 in 1 ['c']
|   |    c []
|   |   |    called
|   |    result : []
|   |    result : []
|    result : [[]]
|    result : [['b']]
|    i: 1 in 2 ['b', 'c']
|    c ['b']
|   |    called
|   |    i: 0 in 1 ['b']
|   |    b []
|   |   |    called
|   |    result : []
|   |    result : []
|    result : [[]]
|    result : [['c']]
 result : [[['b']], [['c']]]
 result : [[['b'], 'a'], [['c'], 'a']]
 i: 1 in 3 ['a', 'b', 'c']
 b ['a', 'c']
|    called
|    i: 0 in 2 ['a', 'c']
|    a ['c']
|   |    called
|   |    i: 0 in 1 ['c']
|   |    c []
|   |   |    called
|   |    result : []
|   |    result : []
|    result : [[]]
|    result : [['a']]
|    i: 1 in 2 ['a', 'c']
|    c ['a']
|   |    called
|   |    i: 0 in 1 ['a']
|   |    a []
|   |   |    called
|   |    result : []
|   |    result : []
|    result : [[]]
|    result : [['c']]
 result : [[['a']], [['c']]]
 result : [[['a'], 'b'], [['c'], 'b']]
 i: 2 in 3 ['a', 'b', 'c']
 c ['a', 'b']
|    called
|    i: 0 in 2 ['a', 'b']
|    a ['b']
|   |    called
|   |    i: 0 in 1 ['b']
|   |    b []
|   |   |    called
|   |    result : []
|   |    result : []
|    result : [[]]
|    result : [['a']]
|    i: 1 in 2 ['a', 'b']
|    b ['a']
|   |    called
|   |    i: 0 in 1 ['a']
|   |    a []
|   |   |    called
|   |    result : []
|   |    result : []
|    result : [[]]
|    result : [['b']]
 result : [[['a']], [['b']]]
 result : [[['a'], 'c'], [['b'], 'c']]
ans:  [[[['b'], 'a'], [['c'], 'a']], [[['a'], 'b'], [['c'], 'b']], [[['a'], 'c'], [['b'], 'c']]]
```

</details>

私「うおっ、見やす」
A「ぎょぎょぎょ！」

私「うわ、めちゃくちゃミスってる...」
A「そうだよ（便乗）」

```py
nums = [*range(10)]
def export_all_sorts(nums_list: list) -> list:

  ans = []
  for i in range(len(nums_list)):

    if len(nums_list) == 1:
      if not nums_list[0]:
        continue
      return [nums_list]

    copied_nums_list = nums_list[:]
    poped = copied_nums_list.pop(i)

    result = export_all_sorts(copied_nums_list)
    for n in result:
      n.append(poped)
    ans = [*ans, *result]
  return ans
```

で、なんやかんやあって完成しましたとさ
〜おしまい〜

# あとがき
例で作ったコード人に見せるつもり無かったから汚くてごめんなさい
（「あ、記事にしよ」って急に思い立ったため）
お読みいただきありがとうございました！！

<font color="今回初めてお話系に挑戦してみました〜　ちなみにぬるぽがかくれてます（） 読んでいただきありがとうございました〜〜〜"><font color="white">感想</font></font>