2012-11-20 60 views
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()?

+0

()? – jimifiki

+2

不要在Python中编写Haskell :) – kennytm

+1

我发现这个问题令人困惑,因为下面的两个答案建议使用'+'(正如我的第一本能)。但是对于所有的意图和目的,'+'也是一个功能!或者在任何情况下,它都会导致另一个函数('list .__ add__')被调用。这个问题的作者是否解决了这个微妙问题? – senderle

回答

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] 
+0

谢谢。我不允许改变给定的功能,功课:P – zkranc

+0

然后使用'[head(xs1)]'并使用'empty()',如果你必须*。 –

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] 
+0

使用三元条件运算符的单线程: return [] if empty(xs)else reverse(tail(xs))+ [head(xs)] –