Python递归合并两个有序数组:基例未执行返回None问题排查
问题分析与修复
核心问题
你的代码存在两个关键问题,导致最终输出异常:
- 递归调用未返回结果:在处理元素比较的递归分支中,调用
merge后没有返回该调用的结果,上层函数执行完递归后无返回值,最终整个函数返回None。 - 切片追加方式错误:基例中使用
new_arr.append(arr2[j:])会把整个子列表作为单个元素插入new_arr,而非将子列表元素逐个添加,最终结果会出现嵌套列表。
修复后的代码
def merge(arr1, arr2, i=0, j=0): new_arr = [] # 基例:arr1已遍历完毕 if i >= len(arr1): return new_arr + arr2[j:] # 基例:arr2已遍历完毕 if j >= len(arr2): return new_arr + arr1[i:] if arr1[i] < arr2[j]: new_arr.append(arr1[i]) return new_arr + merge(arr1, arr2, i+1, j) else: new_arr.append(arr2[j]) return new_arr + merge(arr1, arr2, i, j+1) sortedarr = merge([1,9], [3,7,11,14,18,99]) print(sortedarr)
修复说明
- 移除全局变量:将
new_arr、i、j改为函数内部变量或默认参数,避免全局状态干扰递归流程,让逻辑更独立。 - 传递递归结果:每次递归调用时,将当前
new_arr与递归返回的结果拼接后返回,确保每一层的结果都能向上传递。 - 正确拼接剩余元素:基例中用
new_arr + arr2[j:]的方式直接拼接剩余元素,避免嵌套列表问题,同时直接返回完整结果。 - 简化边界判断:用
i >= len(arr1)替代i > len(arr1)-1,逻辑更直观易懂。
运行修复后的代码,输出结果为:
[1, 3, 7, 9, 11, 14, 18, 99]
内容的提问来源于stack exchange,提问作者Soumyadyuti Nandy
相关产品推荐
相关产品推荐

