You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python递归提取列表中偶数的一半并移除奇数问题求助

修复递归函数halfEven中无法正确移除奇数的问题

问题描述

我写了一个递归函数halfEven,想要实现两个功能:

  1. 移除列表中的所有奇数
  2. 将列表中的偶数除以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的原因。

解决方向

递归处理这类列表过滤/转换问题时,不要修改原列表,而是根据当前元素的情况决定是否加入结果:

  1. 检查当前第一个元素:
    • 如果是偶数,除以2后加入结果,再递归处理剩余列表
    • 如果是奇数,直接跳过该元素,递归处理剩余列表
  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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 12:18:27