2017-10-07 5 views
0

J'ai besoin d'une fonction appelée average (a), où a est une liste, et elle renvoie la moyenne des éléments en utilisant la récursivité. Je l'ai résolu avec une fonction auxiliaire appelée sum (qui résout récursivement la somme de tous les éléments d'une liste), mais je veux la résoudre dans la fonction moyenne.
Voici ce que j'ai essayé:Calculer Moyenne de la liste utilisant la récursion en 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])) 

Il devrait revenir 2.0 dans ce cas. Le problème ici est que lorsque j'appelle la fonction dans le retour, je divise à nouveau pour len(a). Ce n'est pas juste.

+1

C'est agréable de vouloir des choses mais ce n'est pas un service de codage gratuit. Faites une tentative légitime et revenez lorsque vous rencontrez un problème spécifique qui ne peut pas être résolu par débogage et Google. –

+0

def promedio (a): si len (a) == 1: retour d'un [0] autre: retour (un [0] + promedio (a [1:]))/len (a) impression (Promedio ([1,2,3])) Ceci est ma tentative, je sais que le problème est que je ne divise pas le résultat final, je divise dans la division, mais ne sais pas comment le résoudre. Im désolé im nouveau à cela, ne sais pas comment formater mon code! –

+0

Modifier votre question pour contenir toutes les informations pertinentes et nommer pour la réouverture. –

Répondre

0

Lorsque vous mettez en commun deux moyennes ou plus, vous devez appliquer une pondération convexe en fonction de la quantité de données sur laquelle elles sont basées. Dans votre cas:

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])) 

donne des poids 1/n et (n-1)/n à l'élément individuel et la moyenne du reste, respectivement.

Une solution plus évolutive fonctionne avec des demi-listes plutôt que de réduire le problème une par une.

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])) 

Cela permet de réduire considérablement les besoins en ressources, ce qui rend la pile récursive O (log n) plutôt que O (n) et en réduisant le stockage supplémentaire pour les sous-listes intermédiaires.

Ces deux solutions fonctionneront pour les petites listes, la seconde étant capable de gérer les problèmes où le premier casse en raison d'un débordement de pile. Cependant, une solution itérative aurait plus de sens que la récursivité pour cette tâche.