2017-10-07 145 views
0

我需要一個名爲average(a)的函數,其中a是一個列表,並且它使用遞歸返回元素的平均值。我用一個名爲sum的輔助函數(它遞歸地解決了列表中所有元素的總和)來解決它,但我想在平均函數內解決它。
這是我曾嘗試:使用Python中的遞歸計算列表的平均值

def average(a): 
    if len(a)==1: 
     return a[0] 
    else: 
     return (a[0]+average(a[1:]))/len(a) 

print(average([1,2,3])) 

應該在這種情況下返回2.0。 這裏的問題是,當我在回報中調用函數時,我再次分割爲len(a)。那是不對的。

+1

很高興想要的東西,但這不是一個免費的編碼服務。進行合法的嘗試並在遇到無法通過調試和Google搜索解決的特定問題時回來。 –

+0

DEF promedio的(a): 如果len的(a)== 1: 返回[0] 否則: 回報(A [0] + promedio(A [1:]))/ LEN(一) 打印(promedio([1,2,3])) 這是我的嘗試,我知道問題是我沒有劃分最終結果,即時劃分內部,但不知道如何解決它。 對不起,即時通訊新的,不知道如何格式化我的代碼! –

+0

編輯您的問題以包含所有相關信息並提名重新開放。 –

回答

0

當您彙集兩個或更多個平均值時,您需要根據每個數據基於多少數據應用凸權重。你的情況:

def average(a): 
    if len(a) == 1: 
     return a[0] 
    else: 
     n = len(a) 
     return (a[0] + (n - 1) * average(a[1:]))/n 

print(average([1,2,3])) 

給予的權重1/n(n-1)/n分別在個別元素,其餘的平均值。

更具擴展性的解決方案與半列表結合使用,而不是逐個減少問題。

def average(a): 
    n = len(a) 
    if n == 1: 
     return a[0] 
    else: 
     mid = n // 2 
     return (mid * average(a[:mid]) + (n - mid) * average(a[mid:]))/n 

print(average([1,2,3])) 

,能夠顯着削減的資源要求,使得遞歸堆棧O(log n)的,而不是爲O(n),並減少所需的中間子列表的額外儲存空間。

這兩個都可以用於小型列表,第二個可以處理由於堆棧溢出而導致第一個故障的問題。然而,迭代解決方案比這個任務的遞歸更有意義。