为什么我的递归数组反转函数运行后未实现数组反转?
递归实现数组反转无效果的原因与修正方法
问题根因
- 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
相关产品推荐
相关产品推荐

