如何使用递归计算嵌套列表的最大长度?

How to use recursion to calculate the max length of a nested list?

这是计算嵌套列表中最大长度的代码。

def max_length(obj):
    """
    Return the maximum length of obj or any of its sublists, if obj is a list.
    otherwise return 0.

    @param object|list obj: object to return length of
    @rtype: int

    >>> max_length(17)
    0
    >>> max_length([1, 2, 3, 17])
    4
    >>> max_length([[1, 2, 3, 3], 4, [4, 5]])
    4
    """
    if isinstance(obj,int):
        return 0
    else:
        return max([len(x) for x in obj])

代码错误,因为我不知道如何正确组合 len() 函数和递归。我该怎么办?

这个怎么样?

def nested_list(l):
    if type(l) is not list:
        return 0

    lens = [len(l)]

    for x in l:
        lens.append(nested_list(x))
    return max(lens)

...如果你想更像 Pythonic 和鸭子类型...

def nested_list(l):
    try:
        lens = [len(l)]
    except TypeError:
        return 0

    for x in l:
        lens.append(nested_list(x))
    return max(lens)

你在这里根本没有使用递归。递归涉及在同一个方法中调用一个方法。这样做的一种方法如下。注意这里分三种情况,

  1. obj 只是一个 integer 时,您需要 return 0
  2. obj 是一个 listintegers 你需要 return length list
  3. obj是异构list时,需要递归

代码示例可以是

>>> def max_length(obj):
...     if isinstance(obj,int):
...         return 0
...     elif all(isinstance(i,int) for i in obj):
...             return len(obj)
...     else:
...         return max(max_length(i) for i in obj)
... 
>>> max_length(17)
0
>>> max_length([1, 2, 3, 17])
4
>>> max_length([[1, 2, 3, 3], 4, [4, 5]])
4

这是最接近您的代码的:

def max_length(obj): if isinstance(obj,int): return 0 else: return max(len(obj), max([max_length(i) for i in obj]))

result = []
if isinstance(obj, int):
    result.append(0)
else:
    for sublist in obj:
        result.append(max_length(sublist))
        result.append(len(obj))
return max(result)

这会很完美。上面的一些代码没有给出正确的答案。