我正在研究如何像计算机科学家一样思考,目前正在尝试掌握递归。我在其中一个问题上遇到了麻烦,所以我希望你能帮助我。
我正在编写一个函数,它找到一个列表的递归最小值,其元素是整数、整数列表、整数列表列表等。
这是我当前的版本:
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),而是将其分配给一个变量,并将其与当前的 min 进行比较。我不明白为什么我需要这样做,因为在我看来,如果我在嵌入列表上执行整个函数,那是一个整数列表,那么它应该进入 elif 语句(而不是 if 语句) 并正确比较这些值。
我知道我必须在这里遗漏一些关于递归的东西。我非常感谢您能给我的任何见解,以帮助我了解是什么使第二个版本有效但第一个版本失败了。
谢谢!