最终的代码我是这样写的:
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格水,结果它们是一样多的。
我平时很少看数据结构与算法之类的东西,看到这类题目硬想,其实很多时候有很多优秀的算法学会思维逻辑可以直接用的,这也是我需要加强的地方。