使用Python中的递归计算列表的平均值
问题描述:
我需要一个名为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)
。那是不对的。
答
当您汇集两个或更多个平均值时,您需要根据每个数据基于多少数据应用凸权重。你的情况:
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),并减少所需的中间子列表的额外储存空间。
这两个都可以用于小型列表,第二个可以处理由于堆栈溢出而导致第一个故障的问题。然而,迭代解决方案比这个任务的递归更有意义。
很高兴想要的东西,但这不是一个免费的编码服务。进行合法的尝试并在遇到无法通过调试和Google搜索解决的特定问题时回来。 –
DEF promedio的(a): 如果len的(a)== 1: 返回[0] 否则: 回报(A [0] + promedio(A [1:]))/ LEN(一) 打印(promedio([1,2,3])) 这是我的尝试,我知道问题是我没有划分最终结果,即时划分内部,但不知道如何解决它。 对不起,即时通讯新的,不知道如何格式化我的代码! –
编辑您的问题以包含所有相关信息并提名重新开放。 –