我在仅使用以下函数使用递归反转列表时遇到问题:

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 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:]

不需要“empty”;在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]

10-06 05:22