You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

数组首尾配对求和至剩2元素的Python函数报错求解

配对求和问题解法说明

原代码报错原因

你的代码触发IndexError的核心原因有两点:

  1. 递归调用位置错误:你将递归逻辑写在了双指针遍历的while循环内部,每计算完一对元素的和就立刻传入递归,而不是等当前轮所有配对完成、生成完整的新数组后再进入下一轮计算。比如处理示例1时,第一次循环仅算出1+10=11,就把长度为1的[11]传入递归,该数组既不满足长度为2的终止条件,进入分支后双指针初始值都为0,while left < right条件不成立,最终返回空列表,后续对空列表做索引访问就会触发越界。
  2. 缺失奇数长度数组的处理逻辑:题目明确要求数组长度为奇数时保留中间元素,你的代码没有处理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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.30 20:21:06