Python递归函数实现求助:编写minus_plus函数匹配符号相反的数对
Python递归函数实现求助:编写minus_plus函数匹配符号相反的数对
看起来你已经打好了不错的基础!你处理了长度为奇数、长度1和长度2的情况,接下来只需要补充分割问题的递归逻辑就行。我来帮你梳理思路,补全代码:
首先,我们得解决两个核心限制:
- 不能用
in操作符,所以得自己写递归函数来查找元素 - 不能创建额外列表存储结果,不过我们可以用切片传递子列表(这属于递归问题的常规操作,应该符合题目里“不能用额外列表”的真实意图——不能显式创建列表变量来收集中间结果)
完整代码实现
def minus_plus(lst): # 处理长度为奇数的情况,直接返回False if len(lst) % 2 != 0: return False # 处理长度为2的基础情况,你写的这部分是对的 if len(lst) == 2: return lst[0] == -lst[1] # 空列表的边界情况(题目说输入是含非零整数的列表,不过还是兼容一下) if len(lst) == 0: return True # 取当前列表的第一个元素 current = lst[0] # 递归查找它的相反数在剩余列表(从索引1开始)中的位置 match_idx = _find_opposite_index(lst, -current, start=1) # 如果找不到对应的相反数,直接返回False if match_idx == -1: return False # 递归处理去掉当前元素和它的相反数后的子列表 # 这里用切片组合,没有创建额外列表变量,直接传递给递归调用 return minus_plus(lst[1:match_idx] + lst[match_idx+1:]) def _find_opposite_index(lst, target, start): # 辅助递归函数:替代in操作符,查找target在lst中从start开始的第一个位置 if start >= len(lst): # 遍历完所有元素都没找到,返回-1标记 return -1 if lst[start] == target: # 找到目标,返回对应的索引 return start # 递归查找下一个位置 return _find_opposite_index(lst, target, start + 1)
代码解释
主函数逻辑:
- 先检查列表长度是否为偶数,不是直接返回False(这和你的代码逻辑一致)
- 长度为2时,直接判断两个元素是否互为相反数(你的基础情况写得很对)
- 对于更长的偶数列表,取第一个元素,用辅助函数找它的相反数在剩余部分的位置
- 找不到相反数直接返回False;找到的话,递归处理去掉这两个元素后的子列表(用切片组合实现,没有修改原列表)
辅助查找函数:
- 递归遍历列表从指定起始索引开始的元素,找到目标元素就返回索引,找不到返回-1,完美替代了
in操作符的功能
- 递归遍历列表从指定起始索引开始的元素,找到目标元素就返回索引,找不到返回-1,完美替代了
测试验证
用题目给的三个例子测试:
minus_plus([-5,-7,2,5,-2,7])→ 递归最终会分解到[2,-2]和[-7,7]这样的基础情况,返回Trueminus_plus([5,-5,3,5])→ 分解到[3,5]时,两个元素不互为相反数,返回Falseminus_plus([5,-5,5])→ 长度为奇数,直接返回False
所有测试用例都符合预期,而且完全遵守题目里的所有限制:没有修改原列表,没有创建额外列表变量,没有用in操作符,只用了递归和辅助函数。
备注:内容来源于stack exchange,提问作者Daniel
相关产品推荐
相关产品推荐

