2014-10-19 3 views

ответ

2

Вы создаете новый список lis на каждой рекурсии. (Кстати, вы можете попытаться найти более описательные имена.) Однако возвращается только первый список, потому что вы ничего не делаете с другими списками, которые являются результатом рекурсии. Вместо этого вы просто вызываете функцию, которая просто создает новый список без каких-либо действий со значением, возвращаемым функцией. Вы можете увидеть это в следующей строке:

ppend(n.rest) # a new list is created but nothing is done with the result of the function 

Если вы только планируете использовать функцию один раз, вы можете просто переместить lis назначения за пределами функции:

lis = [] 

def ppend(n): 
    if n.rest is not None: # the first if statement appears unnecessary 
     lis.append(n.first) 
     ppend(n.rest) 
    return lis # or don't return it but simply refer to lis where you need to 

выше подход, однако , не будет работать, если вы планируете использовать функцию несколько раз и всегда нуждаетесь в новом списке. В последнем случае, вы можете добавить вторую функцию, как это:

def make_ppend(n, lis): # add lis as a parameter to be explicit, but you could rely on scope instead of adding this extra parameter 
    if n.rest is not None: 
     lis.append(n.first) 
     make_ppend(n.rest, lis) 

def ppend(n): 
    lis = [] # now in the local scope 
    make_ppend(n, lis) 
    return lis 

Я предполагаю, что вы после этого что-то вроде второго решения.

+0

Отличный !! Хорошо, это имеет смысл. – Andre

+0

@Ali Отлично! Я рад, что вы поняли это. –

+0

Спасибо, много человек ... Я на самом деле только начинаю учиться рекурсии ... рекурсия немного технична, на мой взгляд. – Andre