2017-10-07 279 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),并减少所需的中间子列表的额外储存空间。

这两个都可以用于小型列表,第二个可以处理由于堆栈溢出而导致第一个故障的问题。然而,迭代解决方案比这个任务的递归更有意义。