
本文介绍一种不创建新列表、不修改原列表、不使用 in 运算符的纯递归解法,通过双参数递归(索引遍历 + 频次校验)严格验证:列表长度为偶数,且每个元素与其相反数在列表中出现次数完全相等。
本文介绍一种不创建新列表、不修改原列表、不使用 `in` 运算符的纯递归解法,通过双参数递归(索引遍历 + 频次校验)严格验证:列表长度为偶数,且每个元素与其相反数在列表中出现次数完全相等。
要解决该问题,关键在于绕过常规的集合或字典计数思路(因禁止新建数据结构),同时规避 in 操作和列表方法(如 sort、remove)。核心策略是:利用递归遍历索引,并借助内置 list.count() 方法进行频次比对——虽然 count() 是线性扫描,但题目未禁止其使用,且它不修改原列表、不生成新列表,符合约束。
函数采用参数重载设计:主函数 minus_plus(lst) 作为入口,实际递归逻辑由带索引参数的 minus_plus(L, i=0) 承担。递归过程如下:
-
终止条件:当索引
i超出列表长度时,说明所有元素均已校验通过,返回True; -
奇数长度预检:若列表总长度为奇数,直接返回
False(无需等待遍历); -
逐元素校验:对当前索引
i处的元素value = L[i],检查L.count(value)是否等于L.count(-value)。若不等(例如存在5但无对应-5,或5出现 2 次而-5仅 1 次),立即返回False; -
递归推进:若当前元素通过校验,则递归调用
minus_plus(L, i + 1)继续检查下一个位置。
以下是完整可运行代码:
def minus_plus(L, i=0):
if i >= len(L):
return True
if len(L) % 2 != 0:
return False
value = L[i]
if L.count(value) != L.count(-value):
return False
return minus_plus(L, i + 1)✅ 正确性说明:
-
[−5,−7,2,5,−2,7]→ 长度 6(偶),-5和5各出现 1 次,-7/7、-2/2同理 → 返回True; -
[5,−5,3,5]→3存在但-3缺失 →L.count(3) == 1,L.count(-3) == 0→ 返回False; -
[5,−5,5]→ 长度 3(奇)→ 立即返回False。
⚠️ 注意事项:
- 该解法时间复杂度为 O(n²)(每轮
count()耗时 O(n),共 n 轮),虽非最优,但在题目约束下是合规且简洁的递归实现; - 空列表
[]视为满足条件(长度 0 为偶数,且无违反规则的元素),返回True; - 不依赖任何外部模块或辅助函数,纯粹基于 Python 内置行为与递归控制流。
此方案体现了在强约束条件下,如何通过参数化递归与合理利用语言特性完成逻辑闭环——既是算法思维训练,也是对递归本质的深入理解。

















