我的教授发布了以下功能。我不完全了解它是如何工作的。有人可以解释一下吗?
def rev(a):
if a == []:
return []
else:
return rev(a[1:]) + [a[0]]
答案 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]