我不明白为什么在for循环中的递归函数不会在基本情况下退出该函数。
我正在阅读催人泪下的算法,并尝试实现一个示例以供理解。
box = [
[["key"], []],
[[], []],
[[], []]
]
def find_key(box):
for item in box:
print(item)
if item == "key":
print("found")
return
elif type(item) == type([]):
print("looking in next box")
find_key(item)
find_key(box)
我希望一旦找到键,该函数就会退出,但它将继续浏览列表的其余部分。
这也可能是因为我对返回值(特别是与递归调用有关)的了解不足。我可以使用
来获得预期的行为import sys
def find_key(box):
for item in box:
if item == "key":
print("found")
sys.exit()
elif type(item) == type([]):
print("looking in next box")
find_key(item)
find_key(box)
答案 0 :(得分:1)
您仅退出最后一个递归调用,而不是全部退出。试试这个:
box = [
[["key"], []],
[[], []],
[[], []]
]
def find_key(box):
for item in box:
print(item)
if item == "key":
print("found")
return
elif type(item) == type([]):
print("looking in next box")
return find_key(item) # <-- add a `return`
find_key(box)
# [['key'], []]
# looking in next box
# ['key']
# looking in next box
# key
# found
顺便说一句,isinstance
比等同于类型更好。您可以使用:
isinstance(item, list)
代替type(item) == type([])
。
答案 1 :(得分:0)
添加返回,找到密钥后退出循环
box = [
[["key"], []],
[[], []],
[[], []]
]
def find_key(box):
for item in box:
print(item)
if item == "key":
print("found")
return
elif type(item) == type([]):
print("looking in next box")
return
find_key(box)
答案 2 :(得分:0)
您的问题是,您是从函数返回,而不是函数的全部。由于您正在构建递归函数,因此一次有效的函数有多次迭代(因为一个迭代在返回自身之前调用了另一个)。
您需要重新编写函数以捕获并从每个函数调用返回。我从这篇文章改编了以下内容:Python: How to search a nested list using recursion
def find_key(box):
for item in box:
if type(item) is list:
if find_key(item):
return "found"
if item == "key":
print("found")
return "found"
return