2016-02-23 66 views
0

這是我想出的非遞歸代碼。Python:製作一個採用列表的遞歸函數,並返回一個包含前一個列表元素但不重複的列表?

def newlst(lst): 
    new_lst = [] 

    for element in lst: 
     if element not in new_lst: 
      new_lst.append(element) 

    return new_lst 

現在,這裏是我在一個遞歸版本的嘗試:

def newlst(lst): 
    new_lst = [] 

    if lst == []: 
     return new_lst 

    if lst[0] in new_lst: 
     new_lst.append(lst[0]) 
    else: 
     return newlst(lst[1:]) 

我知道,我每一個函數調用本身,我不知道在哪裏的時間分配newlst空列表值否則分配它...所以我迷路了。

+0

你有遞歸過程中隨身攜帶的結果,所以你的第二個'newlist'功能缺少這個論點。 otoh,這是一個O(n ** 2)的方式來做到這一點 - 雖然排序只是O(n日誌n)... – thebjorn

+1

這樣做與遞歸不是一個好主意......如果這是一個任務,告訴你的老師,這是一個學習遞歸的可怕的練習,他們應該想一個更好的練習。 – poke

+0

通過使用'bisect'模塊來執行插入排序(而不是'append'),您可能潛在地挽救了此算法的複雜性,但這種排除了遞歸的需要(因爲您只是遍歷列表) 。我同意@poke說,這是一個學習遞歸的可怕練習。 – thebjorn

回答

1

同意這是刪除重複的一個可怕的方式,但如果你真的想要一個遞歸解決方案:

def newlst(lst): 
    if not lst: 
     return lst 

    new_lst = newlst(lst[1:]) 
    return new_lst if lst[0] in new_lst else [lst[0]] + new_lst 

>>> newlst([1,1,2]) 
[1, 2] 
0
def newlst(lst): 
    if lst == []: 
     new_list = []   
    elif lst[0] in lst[1:]: 
     new_list = newlst(lst[1:])   
    else: 
     new_list =[lst[0]]+ newlst(lst[1:])       
    return new_list 
相關問題