Python:反转函数的解释

时间:2013-01-31 21:24:10

标签: python recursion

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

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

2 个答案:

答案 0 :(得分:2)

这样做是以递归方式反转列表。查看其工作原理的最简单方法是follow through the execution

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

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

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

def rev(seq):
    return rev(seq[1:]) + [seq[0]] if seq else []
  • 我们使用三元运算符来压缩if/else
  • a替换seq会使函数更清晰 - Python没有严格的输入,所以使用能够提供函数所需内容的名称(在本例中为序列) ),让它更清晰。
  • 我们也只需检查a == []即可替换seq。由于列表在空时评估为False,因此无需与空列表进行比较。

答案 1 :(得分:2)

a是一个列表。如果a是空列表,则返回空列表。如果没有,则将(反向)函数(递归)应用于列表但第一个元素,然后追加第一个元素。这样,在每次递归调用反向时,都会从最右边的元素开始构建反向列表。

这是一个例子:

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]