python-3.x - 递归地展平列表列表
问题描述
有人可以说明或分解这个递归函数是如何执行的吗
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))
我怎样才能跟踪这个算法的执行?
解决方案
好的,正如您所说,这是一个递归函数。它主要是“查看下一个元素并决定如何处理它”的方法。它从基本情况开始。
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 之类的。
推荐阅读
- groovy - 在groovy中将字符串日期转换为日期格式时出现问题:
- python - 使用 Selenium WebDriver 截屏,同时保持 html (python) 的字体
- vb.net - 需要帮助使用 OracleBulkCopy 插入时间戳
- zsh - zsh 在 vi 模式下;如何更改配色方案?
- classification - 当预测数据中存在决策树模型中不可用的属性值时如何处理
- react-native - 如何在 react-native 中连接到 ftp 服务器?
- python - pandas 向量化优化-python
- javascript - 如何使下拉菜单扩展到右侧而不是向下?
- discord.js - DiscordJS 反转图像命令不显示任何内容
- c++ - 将数据复制到另一个任务