我想要一个函数,它将返回给出的列表的反向 - 使用递归.我怎样才能做到这一点?
将列表的第一个元素附加到反向子列表:
mylist = [1, 2, 3, 4, 5] backwards = lambda l: (backwards (l[1:]) + l[:1] if l else []) print backwards (mylist)
更明确一点:
def rev(l): if len(l) == 0: return [] return [l[-1]] + rev(l[:-1])
这变成了:
def rev(l): if not l: return [] return [l[-1]] + rev(l[:-1])
哪个变成:
def rev(l): return [l[-1]] + rev(l[:-1]) if l else []
这和另一个答案是一样的.
尾递归/ CPS样式(无论如何python都不优化):
def rev(l, k): if len(l) == 0: return k([]) def b(res): return k([l[-1]] + res) return rev(l[:-1],b) >>> rev([1, 2, 3, 4, 5], lambda x: x) [5, 4, 3, 2, 1]
我知道这不是一个有用的答案(虽然这个问题已经得到解答),但在任何实际代码中,请不要这样做.Python无法优化尾调用,函数调用缓慢且具有固定的递归深度,因此至少有3个原因可以反复进行迭代.