python中for循环内的递归调用未在预期的地方退出

时间:2019-01-31 03:00:06

标签: python algorithm recursion

我不明白为什么在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)

3 个答案:

答案 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