2014-03-28 84 views
1

前言:這是我以前在我的數據結構和算法類中進行的考試。比較列表;返回唯一列表。 - Python

問題:修改此函數,以便返回L1和L2中這些項目的排序列表。例如,給定[1,2,3,4,5],[0,2,3,5,8]該函數應返回[2,3,5]。該函數必須以某種方式使用遞歸。

def merge(L1, L2): 
     if L1 == []: 
      return L2 
     elif L2 == []: 
      return L1 
     elif L1[0] <= L2[0]: 
      return L1[:1] + merge(L1[1:], L2) 
     else: 
      return L2[:1] + merge((L1, L2[1:]) 

我修改的功能:

def merge(L1, L2): 
     if L1 == []:     
      return L1 
     elif L2 == []:    
      return L2 
     elif L1[0] < L2[0]:   #Push L1 forward 
      return merge(L1[1:], L2) 
     elif L1[0] > L2[0]:   #Push L2 forward 
      return merge(L1, L2[1:]) 
     elif L1[0] == L2[0]:  #If same element, return element 
      return L1[:1] + merge(L1[1:], L2[1:]) 

我使用的基本if語句來推動名單前確保正在檢查每個列表中的每個元素互相反對。天色漸晚,我以前的代碼保存返回[2,3,5,8],因爲我本來有:

if L1 == []: 
     return L2 
    elif L2 == []: 
     return L1 

當L1耗盡它會返回L2.I的其餘部分則是重新輸入代碼並意外地放入:

if L1 == []: 
     return L1 
    elif L2 == []: 
     return L2 

它的工作!輸出是[2,3,5],但是,它並沒有任何意義,我

我的問題是:

爲什麼前兩個如果返回耗盡列表的報表給我的輸出[2 ,3,5]

爲什麼返回空列表中的遞歸函數?

最後,如果我的列表在遞歸函數中耗盡,是否有辦法打破if語句鏈?

+1

我不明白你的問題的最後一部分。你能解釋一下嗎? – thefourtheye

+0

對不起,最後一個問題可以忽略不計。這是一個重複。我不明白前兩個如果陳述如何工作,直到他們解釋。他們是我的基本案例。 – Aimforchris

回答

3

爲什麼前兩個if語句返回用完的列表給我輸出[2,3,5]?

因爲當其中一個列表中沒有剩餘元素時,空白列表與其他列表中的其餘列表之間沒有任何共同之處。

爲什麼返回一個空列表中的遞歸函數?

return L1return L2基本條件的遞歸。一旦遇到,我們就得到了一個確定的值(不是另一個遞歸級別)。除非我們決定遞歸,否則一旦滿足基本條件,遞歸將放鬆並返回結果。

0

你想找到兩個列表的交集。因此,如果任何一個列表爲空,您需要返回一個空列表,因爲交叉點是[]。

輸出返回[2,3,5]因爲以前的遞歸調用具有

elif L1[0] == L2[0]: 
    return L1[:1] + merge(L1[1:], L2[1:]) 
從上面的語句

因此,該將被添加的唯一的元素將是兩者共同的的那些名單。
聲明還可以被修改爲:

return L1[0] + merge(L1[1:], L2[1:]) #add the common element and merge the remaining parts