使用python中的递归计算列表的平均值

时间:2017-10-07 14:38:48

标签: python-3.x list recursion average

我需要一个名为average(a)的函数,其中a是一个列表,它使用递归返回元素的平均值。我用一个名为sum的辅助函数解决了它(它递归地解决了列表中所有元素的总和),但是我想在平均函数中解决它。
这就是我的尝试:

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 :(得分: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),并减少了中间子列表所需的额外存储空间。

这两个都适用于小型列表,第二个能够处理由于堆栈溢出导致第一次崩溃的问题。但是,迭代解决方案比递归此任务更有意义。