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 に答える