为何if语句内用递归的Python列表去重函数无法正常工作?
递归去重函数的问题分析
第一段代码失效的原因
先看第一段代码的逻辑:
def norep(xs): if len(xs) == 0: return xs if xs[0] in norep(xs[1:]): return xs[1:] else: return xs
它的核心错误在于返回值完全不符合去重逻辑:
- 当判断
xs[0]存在于递归处理后的子列表时,直接返回未经过任何处理的原剩余列表xs[1:],而不是返回递归处理好的去重子列表。这等于前面的递归判断白做了,子列表根本没被去重,只是单纯砍掉了第一个元素。 - 当
xs[0]不在递归子列表里时,直接返回整个原列表xs,等于完全跳过了后续所有元素的去重处理,直接把原列表返回。
拿你的测试用例来说,第一次调用时,xs[0]是1,递归处理xs[1:]后发现里面确实有1,于是直接返回原xs[1:]也就是[2, 33, 4, 5, 2, 1, 24, 34, 2, 3, 5],整个函数到此结束,后续没有任何去重操作,所以输出就是这个原剩余列表。
第二段代码正常工作的原因
再看第二段代码:
def norep(xs): if len(xs) == 0: return xs if xs[0] in xs[1:]: return norep(xs[1:]) else: return [xs[0]] + norep(xs[1:])
这段的逻辑是正确的递归去重思路:
- 当
xs[0]在原剩余子列表里存在时,说明当前元素是重复的,于是递归处理剩余子列表,跳过当前元素。 - 当
xs[0]在剩余子列表里不存在时,说明当前元素是唯一的,就把它和递归处理好的剩余子列表拼接,保留这个元素。
每一步递归都会处理剩余的子列表,最终把所有重复的前置元素过滤掉,只保留每个元素最后出现的实例,所以能得到符合预期的去重结果。
内容的提问来源于stack exchange,提问作者Jurandy Junior
相关产品推荐
相关产品推荐

