【问题标题】:Calculate Average of list using recursion in python在python中使用递归计算列表的平均值
【发布时间】:2017-10-07 14:38:47
【问题描述】:

我需要一个名为 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。 这里的问题是,当我在 return 中调用函数时,我再次划分 len(a)。这是不对的。

【问题讨论】:

  • 想要东西很好,但这不是免费的编码服务。当您遇到无法通过调试和谷歌搜索解决的特定问题时,请进行合法尝试并返回。
  • def promedio(a): if len(a)==1: return a[0] else: return (a[0]+promedio(a[1:]))/len(a ) print(promedio([1,2,3])) 这是我的尝试,我知道问题是我没有划分最终结果,我在划分内划分,但不知道如何解决。对不起,我是新手,不知道如何格式化我的代码!
  • 编辑您的问题以包含所有相关信息并提名重新开放。
  • 您不能格式化评论,也不应该在 cmets 中发布代码

标签: python-3.x list recursion average


【解决方案1】:

当您合并两个或多个平均值时,您需要根据每个平均值所基于的数据量来应用凸加权。在你的情况下:

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

这两种方法都适用于小型列表,第二种方法可以处理第一种情况由于堆栈溢出而崩溃的问题。但是,对于此任务,迭代解决方案比递归更有意义。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-14
    • 2018-01-05
    • 1970-01-01
    • 2020-05-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多