前書き
プログラミング初心者がダラダラ喋ってるメモです〜
昨日たまたま数学の問題を出される機会があって
テキトーにプログラムを書いていたときのお話......
お話
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
で、なんやかんやあって完成しましたとさ
〜おしまい〜
あとがき
例で作ったコード人に見せるつもり無かったから汚くてごめんなさい
(「あ、記事にしよ」って急に思い立ったため)
お読みいただきありがとうございました!!
感想