2

在这个递归代码中,我让函数正确返回 True,但随后它继续执行 1 个额外步骤并将返回值更改为“None”。我相信我不正确理解返回值。有人能告诉我为什么会这样吗?先感谢您。

--

def nestedListContains(NL, target):
   for i in range(0, len(NL)):
      if type(NL[i]) == int:
         if NL[i] == target:
            return True
         elif i == (len(NL) - 1):
            return False
      elif type(NL[i]) != int:
         nestedListContains(NL[i], target)

nestedListContains([[9, 4, 5], [3, 8]], 3)   #Test Case#
4

3 回答 3

1

您的代码存在三个问题;首先,您对递归调用的结果不做任何事情。其次,您应该使用isinstance()来检查一个值是否属于某种类型,而不是type(ob) ==. 第三,不要使用 range() 并检查 i 是否达到最后一个值,如果没有找到,则在循环后返回 False。

总共:

def nestedListContains(NL, target):
    for value in NL:
        if isinstance(value, int):
            test = value == target
        else:
            # value is not an int, so it's a list
            test = nestedListContains(value, target)
        if test:
            return True  # found target

    return False  # We finished the loop without finding target

如果 NL 根本不是列表,这将引发 TypeError。这可能是一个比 isinstance() 更好的检查——如果它可以被迭代,那么它就是一个列表,如果迭代抛出一个 TypeError 它是我们应该与目标进行比较的东西。我还将使命名更加标准:

def nested_list_contains(nested_list, target):
    try:
        for value in nested_list:
            if nested_list_contains(value, target):
                return True
        return False
    except TypeError:
        # It's a single value
        return nested_list == target

但还有更好的方法。我们真正想做的是将嵌套列表展平,并检查目标是否在其中。我们可以把上面的代码变成一个生成器,递归地扁平化迭代:

def flatten_nested_list(nested_list):
    try:
        for v in nested_list:
            for flattened in flatten_nested_list(v):
                yield flatten
    except TypeError:
        yield nested_list

def nested_list_contains(nested_list, target):
    return target in flatten_nested_list(nested_list)
于 2013-11-01T14:52:27.587 回答
0

要使用递归,您必须返回递归结果:

def nestedListContains(NL, target):
   for i in range(0, len(NL)):
      if type(NL[i]) == int:
         if NL[i] == target:
            return True
         elif i == (len(NL) - 1):
            return False
      elif type(NL[i]) != int:
         #you missed the return for the recursive case
         ret = nestedListContains(NL[i], target)
         if(type(ret) == bool): #ensure we have an actual result and not a fall through
             return ret
于 2013-11-01T14:00:08.050 回答
-1

为了详细说明较早的答案,None当您到达函数末尾而不返回特定值时,您会得到:

  def func():
     ... do something ...

相当于:

  def func():
     ... do something ...
     return None

return如果你传入一个空的 NL,这仍然会发生,因为循环之后没有语句。

(也是isinstance(value, int)检查某物类型的首选方法)

于 2013-11-01T14:03:27.590 回答