数组首尾配对求和至剩2元素的Python函数报错求解
配对求和问题解法说明
原代码报错原因
你的代码触发IndexError的核心原因有两点:
- 递归调用位置错误:你将递归逻辑写在了双指针遍历的
while循环内部,每计算完一对元素的和就立刻传入递归,而不是等当前轮所有配对完成、生成完整的新数组后再进入下一轮计算。比如处理示例1时,第一次循环仅算出1+10=11,就把长度为1的[11]传入递归,该数组既不满足长度为2的终止条件,进入分支后双指针初始值都为0,while left < right条件不成立,最终返回空列表,后续对空列表做索引访问就会触发越界。 - 缺失奇数长度数组的处理逻辑:题目明确要求数组长度为奇数时保留中间元素,你的代码没有处理
left == right的场景,会导致生成的新数组缺项,计算逻辑不符合题目要求。
正确实现代码
递归实现
和你原本的思路一致,修正递归时机和中间元素处理逻辑即可:
def sumFirstAndLast(array): # 终止条件:数组长度为2时直接返回 if len(array) == 2: return array left = 0 right = len(array) - 1 current_round = [] # 完成当前轮所有首尾配对求和 while left < right: current_round.append(array[left] + array[right]) left += 1 right -= 1 # 奇数长度时补充中间元素 if left == right: current_round.append(array[left]) # 当前轮数组构造完成后,再递归处理下一轮 return sumFirstAndLast(current_round)
迭代实现(无递归深度风险)
如果数组长度较大,递归可能触发栈溢出,可以用循环迭代实现,逻辑更直观:
def sumFirstAndLast(array): current = array.copy() # 不断迭代直到数组长度为2 while len(current) > 2: next_round = [] left = 0 right = len(current) - 1 while left < right: next_round.append(current[left] + current[right]) left += 1 right -= 1 # 补充奇数长度的中间元素 if left == right: next_round.append(current[left]) current = next_round return current
代码验证
两个版本的代码都可以通过题目给出的测试用例:
- 输入
[1, 4, 2, 3, 6, 10],返回[16, 10] - 输入
[-1, 3, 2, -2, 11, 7, -9],返回[-12, 23]
原有逻辑的问题总结
你的核心思路(双指针首尾配对、递归处理新数组)方向是正确的,问题出在执行细节上:
- 未等当前轮的新数组构造完成就提前进入递归,导致每轮传入递归的数组都是不完整的
- 遗漏了奇数长度数组的中间元素保留规则
- 递归调用和数组赋值的时序混乱,最终导致索引越界
内容的提问来源于stack exchange,提问作者Laila Campos
相关产品推荐
相关产品推荐

