0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

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

Posted at

前書き

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

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

お話

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「がんばえ〜(*´ω`*)
私「ありがと〜。でもその顔文字は流行らないし流行らせない

...

私「まあ固定する文字とそれ以外の文字に分けて再帰させればいいよな」
私「多分こんな感じだろ」

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']]]
ログ
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']]]

私「ほげぇ... ふがぁぁ...(´・ω・`)」
A「ぴよぴよぉぉぉ^^」
私「もぅマヂ無理」
A「悠揚たれ」

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

ログにもインデントを設けよう!!

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

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))
ログ
 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']]]

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

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

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

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

あとがき

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

感想

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?