2016-03-01 81 views
0

我知道如何在列表中添加數字遞歸減法(名單)遞歸在Python 3

def mysum(L): 
    if not L: 
     return 0 
    else: 
     return L[0] + mysum(L[1:]) 

你能幫我遞歸構建減法以同樣的方式(只有一個輸入 - 列表)。

mydiff([10,1,2,3]) 

非常感謝

+0

我剛纔穿上它,但我錯了打印結果。 如果mydiff([10,1,2,3])顯示爲8,但應該是4 –

+0

您是否允許使用內部函數,即在'mydiff'內定義函數? – uselpa

回答

1

如果序列爲(3,2,1),結果爲0,但減法會在相反的方向,即2 -13 - (2-1)如果使用return L[0] - mysum(L[1:])

所以我們必須使用一個累加器來保持序列的第一個和第二個元素的差異。

def mydiff(L, acc=None): 
    if not L: 
     return acc 
    else: 
     if acc is None: 
      acc = L[0] - L[1] 
      L = L[2:] 
     else: 
      acc -= L[0] 
      L = L[1:] 
     return mydiff(L, acc) 

更簡單一個;

def mysub(seq, acc=None): 
    seq = iter(seq) 
    if acc is None: 
     item = next(seq, None) 
     if item is None: 
      return acc 
     acc = item 

    item = next(seq, None) 
    if item is None: 
     return acc 
    return mysub(seq, acc - item) 
1

的計算做是

>>> 10-(1+(2+(3+0))) 
4 

所以第一操作是減法,但這些操作的其餘部分保持加法。我認爲你需要使用一個內部函數,如果你不允許第二個參數添加到主要功能:

def mydiff(L): 
    def sub(L, first=False): 
     if not L: 
      return 0 
     else: 
      if first: 
       return L[0] - sub(L[1:]) 
      else: 
       return L[0] + sub(L[1:]) 
    return sub(L, True) 

測試:

>>> mydiff([10,1,2,3]) 
4 
+0

代碼很清楚,但不會返回結果 –

+0

@DanielYefimov您可以在我的示例中看到它確實會返回結果。你爲什麼認爲它不? – uselpa