首页 > 解决方案 > 递归地展平列表列表

问题描述

有人可以说明或分解这个递归函数是如何执行的吗

def flatten(S):
    if S == []:
        return S
    if isinstance(S[0], list):
        return flatten(S[0]) + flatten(S[1:])
    return S[:1] + flatten(S[1:])
s=[[1,2],[3,4]]
print("Flattened list is: ",flatten(s))

我怎样才能跟踪这个算法的执行?

标签: python-3.x

解决方案


好的,正如您所说,这是一个递归函数。它主要是“查看下一个元素并决定如何处理它”的方法。它从基本情况开始。

if S == []:
        return S

所以这是有道理的。你有一个空列表,所以你希望得到一个空列表,它是平的。

if isinstance(S[0], list):
    return flatten(S[0]) + flatten(S[1:])

接下来是第一个“查看下一个元素,决定做什么”,如果我收到一个列表并且第一个元素有一个列表,我将让程序在第一个元素上运行相同的展平方法。

但是接下来是列表的其余部分,我们不知道这是否是平坦的,所以我也会为调用 flatten 做同样的事情。

当它返回时,它们都应该是平面列表。添加两个列表只是将它们连接到一个新列表中,因此这将返回到上一次调用递归方法的级别或返回给用户。

return S[:1] + flatten(S[1:])

从之前我们就知道列表的第一个元素不是 if 语句那样的列表,if isinstance(S[0], list)所以这只是获取一个列表,其中存储了第一个元素,就像在我们没有在列表的其余部分上运行 flatten 之前一样不知道列表的其余部分是否平坦。

至于追踪,如果你没有 Pycharm 或 pdb 对你来说太复杂了。在每个 if 语句中加入一些打印。不要害羞,你就是要阅读它们的人。print(f"First element was a list: {S[0]}, {S[1:]}")如果您是处理如此少量代码的初学者,那么这样做会很好。否则尝试 PDB 之类的。


推荐阅读