2012-11-20 59 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)] –