私は「コンピューター科学者のように考える方法」を研究しており、現在、再帰を把握しようとしています。私は問題の1つに問題を抱えているので、あなたが私を助けてくれることを願っています。
私は、要素が整数、整数のリスト、整数のリストのリストなどであるリストの再帰的最小値を見つける関数を書いています。
これが私の現在のバージョンです:
def recursive_min(nested_num_list):
"""
>>> recursive_min([9, [1, 13], 2, 8, 6])
1
>>> recursive_min([2, [[100, 1], 90], [10, 13], 8, 6])
1
>>> recursive_min([2, [[13, -7], 90], [1, 100], 8, 6])
-7
>>> recursive_min([[[-13, 7], 90], 2, [1, 100], 8, 6])
-13
"""
min = nested_num_list[0]
while type(min) == type([]):
min = min[0]
for item in nested_num_list:
if type(item) == type([]):
recursive_min(item)
elif item < min:
min = item
return min
ただし、これはトップレベルで最小値を見つけるためにのみ機能するため、コードがリストの深部に到達していません。
さて、答えを見ると、私のバージョンは次のようになっているはずです。
def recursive_min(nested_num_list):
"""
>>> recursive_min([9, [1, 13], 2, 8, 6])
1
>>> recursive_min([2, [[100, 1], 90], [10, 13], 8, 6])
1
>>> recursive_min([2, [[13, -7], 90], [1, 100], 8, 6])
-7
>>> recursive_min([[[-13, 7], 90], 2, [1, 100], 8, 6])
-13
"""
min = nested_num_list[0]
while type(min) == type([]):
min = min[0]
for item in nested_num_list:
if type(item) == type([]):
min_of_elm = recursive_min(item)
if min_of_elm < min:
min = min_of_elm
elif item < min:
min = item
return min
recursive_min(item)を実行するだけでなく、それを変数に割り当て、現在の最小値と比較することに注意してください。私の考えのように、埋め込まれたリストに対して関数全体を実行し、それが整数のリストである場合、なぜそれを行う必要があるのかわかりません。その後、ifステートメントではなくelifステートメントに到達する必要があります。 )そして値を適切に比較します。
私はここで再帰について何かが欠けているに違いないことを知っています。2番目のバージョンが機能するのに、最初のバージョンが失敗する理由を理解するのに役立つ洞察をいただければ幸いです。
ありがとうございました!