Joh*_*kin 12
将列表的第一个元素附加到反向子列表:
mylist = [1, 2, 3, 4, 5]
backwards = lambda l: (backwards (l[1:]) + l[:1] if l else [])
print backwards (mylist)
Run Code Online (Sandbox Code Playgroud)
更明确一点:
def rev(l):
if len(l) == 0: return []
return [l[-1]] + rev(l[:-1])
Run Code Online (Sandbox Code Playgroud)
这变成了:
def rev(l):
if not l: return []
return [l[-1]] + rev(l[:-1])
Run Code Online (Sandbox Code Playgroud)
哪个变成:
def rev(l):
return [l[-1]] + rev(l[:-1]) if l else []
Run Code Online (Sandbox Code Playgroud)
这和另一个答案是一样的.
尾递归/ 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]
Run Code Online (Sandbox Code Playgroud)
使用分而治之的策略。D&C 算法是递归算法。\n要使用 D&C 解决此问题,有两个步骤:
\n\n第 1 步:找出基本情况。您能得到的最简单的列表是什么\xe2\x80\x99?如果你得到一个包含 0 或 1 个元素的列表,那么 \xe2\x80\x99s 很容易总结。
\n\nif len(l) == 0: #base case\n return []\n
Run Code Online (Sandbox Code Playgroud)\n\n第 2 步:每次递归调用都需要接近空列表\n
\n\nrecursive(l) #recursion case\n
Run Code Online (Sandbox Code Playgroud)\n\n例如
\n\nl = [1,2,4,6]\ndef recursive(l):\n if len(l) == 0:\n return [] # base case\n else:\n return [l.pop()] + recursive(l) # recusrive case\n\n\nprint recursive(l)\n\n>[6,4,2,1]\n
Run Code Online (Sandbox Code Playgroud)\n\n资料来源:Grokking 算法
\n