Python递归提取列表中偶数的一半并移除奇数问题求助
修复递归函数
halfEven中无法正确移除奇数的问题 问题描述
我写了一个递归函数halfEven,想要实现两个功能:
- 移除列表中的所有奇数
- 将列表中的偶数除以2后保留
但测试时结果不符合预期。输入halfEven([0,5,2,99,555,6,2,4]),得到的结果是[0,5,99,3,1,2],而期望结果是[0,1,3,1,2]。
我的代码如下:
def halfEven(x): if not x: return [] else: i = x[0] if i % 2 == 0: i //= 2 elif i % 2 == 1: x.remove(i) res = [i] + halfEven(x[1:]) return res
问题根源
- 修改原列表导致索引混乱:直接调用
x.remove(i)修改原列表,而递归时使用x[1:]切片,这会让后续递归处理的元素顺序出错。比如移除第一个元素5后,原列表的元素位置发生变化,但你还是按原索引取剩余元素,导致跳过了本该处理的偶数。 - 奇数仍被加入结果:即使移除了原列表中的奇数,你还是把那个奇数
i加入了结果列表res,这就是结果里还会出现5、99的原因。
解决方向
递归处理这类列表过滤/转换问题时,不要修改原列表,而是根据当前元素的情况决定是否加入结果:
- 检查当前第一个元素:
- 如果是偶数,除以2后加入结果,再递归处理剩余列表
- 如果是奇数,直接跳过该元素,递归处理剩余列表
- 始终使用切片
x[1:]传递剩余元素,避免修改原列表带来的索引问题。
修复后的代码
def halfEven(x): if not x: return [] current = x[0] if current % 2 == 0: return [current // 2] + halfEven(x[1:]) else: return halfEven(x[1:])
测试该代码,输入halfEven([0,5,2,99,555,6,2,4])会得到预期的[0,1,3,1,2]。
内容的提问来源于stack exchange,提问作者SKJ
相关产品推荐
相关产品推荐

