赞同 1
分享

用Python做递归求平均值

简介:今天朋友给了一个题目,用递归函数求出平均值。刚开始以为每次返回的时候除以2就可以了,结果发现不是的甚至觉得这个题有点恶心人。
  2020.07.29
  Bug Man
  1
  70
  172.17.0.1
  中国.上海
 
 

最终的代码我是这样写的:

def avg_recursion(num_list):
    if isinstance(num_list, list):
        while len(num_list) > 2:
            num = num_list.pop(-1)
            result, n = avg_recursion(num_list)
            return ((num - result) / (n + 1)) + result, n + 1
        return sum(num_list) / 2, 2


if __name__ == '__main__':
    a = [10, 11, 12, 5, 4, 10.2, 15.3]
    r = avg_recursion(a)
    print(r)  # (9.642857142857142, 7)

在写这个函数的时候我的脑海中的画面是这样的:

三个水杯怎么倒一样多的水

就先默认前面两个水杯是return sum(num_list) / 2, 2这个位置返回,它们先进行平均。这样的结果就是第二个杯子往第一个杯子里面倒1格水,这样他们都是2格水了。这里操作完了之后return ((num - result) / (n + 1)) + result, n + 1循环内的返回看作前面两个任意一个杯子和第三个杯子平均,第三个杯子比前面的多了6格水现在一个是三个杯子需要平均,就讲这6格平均分为三份放在。这样前面两个杯子都加2格水,第三个杯子一共倒了4格水,结果它们是一样多的。

我平时很少看数据结构与算法之类的东西,看到这类题目硬想,其实很多时候有很多优秀的算法学会思维逻辑可以直接用的,这也是我需要加强的地方。