2016-05-06 61 views
-1

我需要編寫一個函數nested_sum(L)它會將列表中的所有int整合到一個列表中,而不管它們是否在另一個列表中。這與recrusively調用另一個功能mult2(n)複雜的遞歸函數

實施例:

>>> nestedSum(mult2([1,['a',3,'b',2],[4,['h',8,[10]]], -5])) 
24 

我試圖實現代碼:

def mult2(n): 
    if type(n) == int and n%2 ==0: 
     return n 

def nested_sum(L): 
    total = 0 
    for i in L: 
     if isinstance(i, list): 
      total += nested_sum(i) 
     else: 
      total += i 
    return total 

而且unfortanetly我不能改變MULT2(n)的函數的代碼。我只能改變nested_sum(L)函數。

有人可以給我一個線索怎麼辦? 謝謝。

+0

你必須使用mult2函數嗎? –

+0

你試圖解決的實際問題是什麼? – Daenyth

+0

@Ni。是的,我必須使用它。 – Netta

回答

2

我不知道的是,例如調用正確的:

nestedSum(mult2([1,['a',3,'b',2],[4,['h',8,[10]]], -5])) 

調用列表上mult2()總會回報None。通過NonenestedSum()將始終導致TypeError

mult2()設計用於過濾掉非整數和奇數整數。我認爲你應該通過mult2的過濾功能,以nestedSum()

def mult2(n): 
    if type(n) == int and n%2 ==0: 
     return n 

def nested_sum(L, predicate): 
    total = 0 
    for item in L: 
     if isinstance(item, list): 
      total += nested_sum(item, predicate) 
     elif predicate(item): 
      total += item 
    return total 

現在要調用的函數,通過mult2()作謂語功能nested_sum():

>>> nested_sum([1,['a',3,'b',2],[4,['h',8,[10]]], -5], mult2) 
24 
+0

非常感謝!你能告訴我「如果L」是什麼意思嗎?你爲什麼使用它? – Netta

+1

@Netta:'如果L:'?本來應該防止「None」被傳入(就像在原始調用中那樣),但它可以被刪除。我已經更新瞭解決方案。 – mhawke

2

這將是更好的遞歸劃分爲不同的功能,只有確實像在以下幾點:

sum(x for x in iflatten(L) if cond) 

其中iflatten是一個迭代器返回的扁平化的功能和版本cond你的情況type(x) == int and x % 2 == 0

def iflatten(L): 
    for i in L: 
     if isinstance(i, list): 
      for r in iflatten(i): 
       yield r 
     else: 
      yield i 

的代碼測試出來是這樣的:

L = [1,['a',3,'b',2],[4,['h',8,[10]]], -5] 

def iflatten(L): 
    for i in L: 
     if isinstance(i, list): 
      for r in iflatten(i): 
       yield r 
     else: 
      yield i 

sum(x for x in iflatten(L) if type(x) == int and x % 2 == 0) 

結果24

正如你不能改變

def mult2(n): 
    if type(n) == int and n%2 ==0: 
     return n 

我們可以在條件改變從type(x) == int and x % 2 == 0mult2(x) is not None所有功能,在其末端有一個隱含的return None

讓測試過:

L = [1,['a',3,'b',2],[4,['h',8,[10]]], -5] 

def iflatten(L): 
    for i in L: 
     if isinstance(i, list): 
      for r in iflatten(i): 
       yield r 
     else: 
      yield i 

def mult2(n): 
    if type(n) == int and n%2 ==0: 
     return n 

sum(x for x in iflatten(L) if mult2(x) is not None) 

也導致24

0

如果可以的話不使用mult2,但仍然必須使用遞歸,這將做這項工作:

def sumArr(arr): 
    return sum([numVal(item) for item in arr]) 

def numVal(item): 
    if instanceof(item, int): return item 
    elif instance(item, list): return sumArr(item) 
    else: return 0 

sumArr([1,['a',3,'b',2],[4,['h',8,[10]]], -5]) # >>> 23