2017-10-07 7 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

物事がほしいのはいいですが、これは無料のコーディングサービスではありません。正当な試みをして、デバッグやグーグルで解決できない特定の問題に遭遇したときに戻ってきてください。 –

+0

DEF promedio(A): lenの(A)== 1場合: リターン([0] + promedio([1:]))/ LEN(A) プリント[0]他 を返します(プロメディオ([1,2,3])) これは私の試みですが、問題は最終結果を分割していないことです。私は部門内で分割していますが、解決方法はわかりません。 私はこれで新しい、私のコードをフォーマットする方法を知らない! –

+0

質問を編集してすべての関連情報を入力し、再開のために指名してください。 –

答えて

0

平均を2つ以上プールする場合、それぞれのデータの基準に基づいて凸の重み付けを適用する必要があります。あなたのケースでは:

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を与えます。

よりスケーラブルなソリューションは、問題を1つ1つ減らすのではなく、ハーフリストで機能します。劇的製造むしろOより再帰スタックO(ログn)(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])) 

これらはどちらも小さなリストでは機能し、スタックオーバーフローのために最初のスタックが壊れてしまう問題に対処できます。しかし、反復的な解法はこのタスクの再帰よりも理にかなっています。

関連する問題