我需要一个名为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)
。那不对。
答案 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),并减少了中间子列表所需的额外存储空间。
这两个都适用于小型列表,第二个能够处理由于堆栈溢出导致第一次崩溃的问题。但是,迭代解决方案比递归此任务更有意义。