2

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

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() 的情况下做到这一点?

4

2 回答 2

5
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]
于 2012-11-20T12:58:56.323 回答
2

您可以避免更改列表,而是返回一个新列表:

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]
于 2012-11-20T12:51:17.323 回答