You need to enable JavaScript to run this app. 为什么我的递归数组反转函数运行后未实现数组反转?
优惠活动
大模型
产品
解决方案
定价
更多

为什么我的递归数组反转函数运行后未实现数组反转?

递归实现数组反转无效果的原因与修正方法

问题根因

  • Python 列表的切片语法arr[start:end]会生成全新的独立列表副本,不会创建原列表的内存引用视图。你递归调用时传入的arr[l+1:r]就是这个临时副本,函数内的交换操作只会修改副本内容,递归结束后副本直接被回收,完全不会影响最外层定义的原数组。
  • 你测试用的初始数组首尾元素都是-1,第一次对原数组执行的首尾交换因为元素值完全相同,根本没有产生实际改动;后续所有递归修改都作用在临时副本上,没有回写到原数组,最终就会出现打印结果和原数组完全一致的现象。

推荐修正方案

最常用的无切片、无多余副本的写法是把左右边界作为递归参数传递,全程直接操作原数组内存:

def reverseArray(arr, l=0, r=None):
    # 首次调用时初始化右边界
    if r is None:
        r = len(arr) - 1
    if l < r:
        # 交换原数组对应索引的元素
        arr[l], arr[r] = arr[r], arr[l]
        # 缩小索引范围继续递归,全程不生成切片副本
        reverseArray(arr, l + 1, r - 1)

if __name__ == "__main__":
    arr = [-1, -1, 6, 1, 9, 3, 2, -1, 4, -1]
    reverseArray(arr)
    print(arr)

如果坚持要使用切片写法,必须补充递归结果的回写,否则操作永远不会作用到原数组:

def reverseArray(arr):
    l = 0
    r = len(arr) - 1
    if l < r:
        arr[l], arr[r] = arr[r], arr[l]
        # 将递归处理完的切片结果赋值回原数组的对应位置
        arr[l+1:r] = reverseArray(arr[l+1:r])
    # 必须返回当前处理的数组,否则递归链拿不到修改后的结果
    return arr

if __name__ == "__main__":
    arr = [-1, -1, 6, 1, 9, 3, 2, -1, 4, -1]
    reverseArray(arr)
    print(arr)

注意:切片写法会生成多次列表副本,性能远低于传边界的实现,仅作为语法参考,实际开发更推荐传边界的写法。

内容的提问来源于stack exchange,提问作者Ajay

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.11.09 22:45:08