0

我的教授在下面发布了功能。我不完全理解它是如何工作的。有人可以解释一下吗?

def rev(a):
    if a == []:
        return []
    else:
        return rev(a[1:]) + [a[0]]
4

2 回答 2

2

这样做是递归地反转列表。了解其工作原理的最简单方法是跟踪执行

该函数获取字符串并通过返回除第一项 ( ) 之外的所有项的反转版本a[1:]并将第一项附加到末尾来解决它。

请注意,这是在实际情况下执行此操作的不好方法(我假设您的教授只是展示了递归的想法),因为 Python 没有针对递归进行优化。相反,使用内置reversed().

此外,它不是特别 Pythonic 的代码。如果必须有一个递归解决方案,而不是使用高效、有效、经过良好测试、易于使用的内置解决方案,请考虑:

def rev(seq):
    return rev(seq[1:]) + [seq[0]] if seq else []
  • 我们使用三元运算符来压缩if/else.
  • 替换aseq使函数更清晰 - Python 没有严格的类型,因此使用可以为函数提供线索的名称(在本例中为sequence),使其更清晰。
  • a == []我们还通过简单地检查来替换seq。当列表评估为False空时,无需与空列表进行比较。
于 2013-01-31T21:27:09.923 回答
2

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]
于 2013-01-31T21:30:40.513 回答