2014-10-19 98 views
1

列出我有這樣的:追加LinkedLists項目使用遞歸

def ppend(n): 
    lis = [] 
    if n.rest == None: 
     pass 
    else: 

     lis.append(n.first) 
     ppend(n.rest) 

    return lis 

n是一個鏈表[1,2,3]

我得到的輸出是:

[1] 

但我要找的輸出是:

[1,2,3] 

回答

2

您正在爲每個遞歸創建一個新的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 

上述方法,:您可以在下面一行看到這一點:

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

如果你只打算使用一次的功能,你可以簡單地移動功能之外lis分配,如果您打算多次使用此功能並且始終需要一個新列表,它將不會起作用。在後一種情況下,您可以添加第二個功能是這樣的:

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 2014-10-19 01:01:14

+0

@Ali太棒了!我很高興你明白了。 – 2014-10-19 01:02:15

+0

非常感謝你......我其實只是開始學習遞歸......遞歸在我看來有點技術性。 – Andre 2014-10-19 01:04:01