我的教授在下面发布了功能。我不完全理解它是如何工作的。有人可以解释一下吗?
def rev(a):
if a == []:
return []
else:
return rev(a[1:]) + [a[0]]
这样做是递归地反转列表。了解其工作原理的最简单方法是跟踪执行。
该函数获取字符串并通过返回除第一项 ( ) 之外的所有项的反转版本a[1:]
并将第一项附加到末尾来解决它。
请注意,这是在实际情况下执行此操作的不好方法(我假设您的教授只是展示了递归的想法),因为 Python 没有针对递归进行优化。相反,使用内置的reversed()
.
此外,它不是特别 Pythonic 的代码。如果必须有一个递归解决方案,而不是使用高效、有效、经过良好测试、易于使用的内置解决方案,请考虑:
def rev(seq):
return rev(seq[1:]) + [seq[0]] if seq else []
if/else
.a
为seq
使函数更清晰 - Python 没有严格的类型,因此使用可以为函数提供线索的名称(在本例中为sequence),使其更清晰。a == []
我们还通过简单地检查来替换seq
。当列表评估为False
空时,无需与空列表进行比较。a 是一个列表。如果 a 是空列表,则返回空列表。如果没有,您将(递归)您的“反向”函数应用于列表但第一个元素,然后附加第一个元素。这样,在每次递归调用 reverse 时,您都会从最右边的元素开始构建反向列表。
这是一个例子:
l=[1,4,6,7]
rev(l) returns rev([4,6,7])+[1]
rev([4,6,7]) returns rev([6,7])+[4]
...
最后你有 rev([]) 返回空列表并终止递归调用。
顺便说一句,要反转列表l
,只需使用
l[::-1]