接下来的步骤是使这个递归和更具python风格
我的最终目标是通过对列表中的每一对进行求和,生成一个较小的列表,对每一对进行求和,以此类推,来求和一个值列表。目前,我有一个包含偶数个元素的列表,但最终我希望能够处理任意大小的列表 在以前文章的帮助下,我有了以下功能:接下来的步骤是使这个递归和更具python风格,python,python-3.x,recursion,Python,Python 3.x,Recursion,我的最终目标是通过对列表中的每一对进行求和,生成一个较小的列表,对每一对进行求和,以此类推,来求和一个值列表。目前,我有一个包含偶数个元素的列表,但最终我希望能够处理任意大小的列表 在以前文章的帮助下,我有了以下功能: def collapse_sum(lst): sums = list() rems = list() acc = 0 n = 2 print(lst) print("final sum: {}\n".format(sum(lst))
def collapse_sum(lst):
sums = list()
rems = list()
acc = 0
n = 2
print(lst)
print("final sum: {}\n".format(sum(lst)))
pairs = [lst[i:i + n] for i in range(0, len(lst), n)]
while len(pairs) > 0:
if len(pairs) % 2 == 1:
rems.append(pairs[-1])
del pairs[-1]
for a,b in pairs:
sums.append(a + b)
pairs = [sums[i:i + 2] for i in range(0,len(sums),n)]
sums = list()
if len(pairs) == 1:
for a,b in pairs:
acc += a + b
rems = [item for sublist in rems for item in sublist]
pairs = [rems[i:i + n] for i in range(0, len(rems), n)]
if len(pairs) == 1:
for a,b in pairs:
acc += a + b
del pairs[-1]
return acc
rems = list()
print(acc)
return acc
我的最终目标是通过将每一对值相加来求和
列表,生成一个较小的列表,对这些对进行求和,以及
等等
这里有一个解决方案,它可以在不使用任何库依赖项的情况下为偶数或奇数大小的列表实现这一点
# Helper function to split iterable obj into blocks/chunks
def blocks(obj, n):
for i in range(0, len(obj), n):
yield obj[i:i + n]
def collapse_sum(obj):
while len(obj) > 1:
obj = blocks(obj, 2)
obj = [sum(i) for i in obj]
return obj[0]
一些例子:
a = [1, 2, 3, 4, 5]
b = [1, 2, 3, 4]
collapse_sum(a)
15
collapse_sum(b)
10
您可以将其可视化。编写一个函数。使用它。这实际上很有帮助;谢谢,哇。可视化站点没有显示太多内容,但我添加了一些打印语句来查看发生了什么。我不太明白你是如何设法避免混合列表、余数和其他我努力解决的问题的复杂性和问题的。很好。实际上,我最初赋值的点是浮点错误,为了从通常的累积和函数中得到一个sum()函数来减少这个错误,每次计算和时,fp错误都会对和中的每个项进行累积。这个函数“叠加”总和,因此累积的误差比单独的总和要大。