我只使用以下函数使用递归反转列表时遇到问题:
def head(xs):
return xs[0]
def tail(xs):
return xs[1:]
def empty(xs):
return len(xs) == 0
我可以这样做:
def p(xs1, xs2):
if not empty(tail(xs1)):
p(tail(xs1), xs2)
xs2.append(head(xs1))
def p05(xs):
s = []
p(xs, s)
return s
有没有办法在不使用 append()的情况下做到这一点?
def head(xs):
return xs[0]
def tail(xs):
return xs[1:]
def empty(xs):
return len(xs) == 0
def reverse(xs):
if empty(xs): return []
return reverse(tail(xs))+[head(xs)]
xs = range(4)
print(reverse(xs))
收益 率
[3, 2, 1, 0]
您可以避免就地更改列表,而是返回一个新列表:
def p(xs1, xs2):
if not empty(tail(xs1)):
xs2 = p(tail(xs1), xs2)
return xs2 + [head(xs1)]
def p05(xs):
return p(xs, [])
您可能还应该更改head()
以返回列表:
def head(xs):
return xs[:1]
def tail(xs):
return xs[1:]
并且不需要"空"; []
被认为是在 python 上下文中False
的。然后p()
变成:
def p(xs1, xs2):
if tail(xs1):
xs2 = p(tail(xs1), xs2)
return xs2 + head(xs1)
示范:
>>> p(range(5), [])
[4, 3, 2, 1, 0]