Python如何原地修改列表,前缀和小于阈值时从指定索引后元素置0
问题分析与代码修正方案
原代码问题梳理
- 没有返回值:递归执行完成后没有返回修改后的列表,调用函数无法拿到处理结果
- 违反副本限制:每次调用
sum(numbers[0:last_index])都会生成切片副本,不符合原地修改、不允许创建列表副本的要求 - 逻辑条件错误:阈值判断逻辑与需求相反,且没有处理索引越界、阈值大于等于列表总和、阈值小于第一个元素等边界场景
- 缺少终止条件:没有设置递归的停止边界,极端情况会触发索引越界报错
修正后的递归实现代码
def f(numbers, val, cur_index=0, cur_sum=0): # 递归终止条件:遍历完所有元素,说明总和未超过阈值,直接返回 if cur_index >= len(numbers): return numbers cur_sum += numbers[cur_index] if cur_sum > val: # 原地逐个置0,不创建任何新列表副本 for i in range(cur_index, len(numbers)): numbers[i] = 0 return numbers # 未超过阈值,递归处理下一个元素 return f(numbers, val, cur_index + 1, cur_sum)
验证测试
numbers = [4, 5, 7, 2] print(f(numbers.copy(), 4)) # 输出 [4, 0, 0, 0] print(f(numbers.copy(), 3)) # 输出 [0, 0, 0, 0] print(f(numbers.copy(), 10)) # 输出 [4, 5, 0, 0] print(f(numbers.copy(), 17)) # 输出 [4, 5, 7, 0] print(f(numbers.copy(), 18)) # 输出 [4, 5, 7, 2] 总和等于阈值,无需置0
内容的提问来源于stack exchange,提问作者user17189165
相关产品推荐
相关产品推荐

