递归添加列表唯一元素仅返回首个值,如何修复?
问题分析与修复
你的代码问题在于每次递归调用都会重新创建空的new_set,而且递归返回的结果没有和当前的元素合并——递归得到的去重集合被赋值给bag变量后就没有后续处理,最后返回的始终是当前函数里仅添加了第一个元素的new_set,自然只能拿到第一个值。
下面是两种修复方案:
方案一:传递已收集的集合(推荐,逻辑直观)
通过新增一个可选参数,把已经收集的唯一元素集合传递到递归调用中,避免每次递归都重新创建空列表:
def bag_to_set(bag, current_set=None): # 初始化集合,仅在第一次调用时执行 if current_set is None: current_set = [] if len(bag) > 0: # 检查当前元素是否已在集合中,不在则添加 if bag[0] not in current_set: current_set.append(bag[0]) # 递归处理剩余元素,传递更新后的集合 return bag_to_set(bag[1:], current_set) # 列表为空时返回最终集合 return current_set
测试示例:
print(bag_to_set([1, 2, 1, 3, 2])) # 输出 [1, 2, 3]
方案二:合并递归返回结果
不新增参数,而是先递归处理剩余元素得到去重集合,再判断当前元素是否需要加入:
def bag_to_set(bag): if not bag: return [] # 先递归处理剩余元素,得到去重后的集合 rest_set = bag_to_set(bag[1:]) # 如果当前元素不在递归结果中,就添加到开头(保持原顺序) if bag[0] not in rest_set: rest_set.insert(0, bag[0]) return rest_set
测试示例:
print(bag_to_set([1, 2, 1, 3, 2])) # 输出 [1, 2, 3]
内容的提问来源于stack exchange,提问作者jg22
相关产品推荐
相关产品推荐

