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

Python递归函数实现求助:编写minus_plus函数匹配符号相反的数对

Python递归函数实现求助:编写minus_plus函数匹配符号相反的数对

看起来你已经打好了不错的基础!你处理了长度为奇数、长度1和长度2的情况,接下来只需要补充分割问题的递归逻辑就行。我来帮你梳理思路,补全代码:

首先,我们得解决两个核心限制:

  1. 不能用in操作符,所以得自己写递归函数来查找元素
  2. 不能创建额外列表存储结果,不过我们可以用切片传递子列表(这属于递归问题的常规操作,应该符合题目里“不能用额外列表”的真实意图——不能显式创建列表变量来收集中间结果)

完整代码实现

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)

代码解释

  1. 主函数逻辑:

    • 先检查列表长度是否为偶数,不是直接返回False(这和你的代码逻辑一致)
    • 长度为2时,直接判断两个元素是否互为相反数(你的基础情况写得很对)
    • 对于更长的偶数列表,取第一个元素,用辅助函数找它的相反数在剩余部分的位置
    • 找不到相反数直接返回False;找到的话,递归处理去掉这两个元素后的子列表(用切片组合实现,没有修改原列表)
  2. 辅助查找函数:

    • 递归遍历列表从指定起始索引开始的元素,找到目标元素就返回索引,找不到返回-1,完美替代了in操作符的功能

测试验证

用题目给的三个例子测试:

  • minus_plus([-5,-7,2,5,-2,7]) → 递归最终会分解到[2,-2]和[-7,7]这样的基础情况,返回True
  • minus_plus([5,-5,3,5]) → 分解到[3,5]时,两个元素不互为相反数,返回False
  • minus_plus([5,-5,5]) → 长度为奇数,直接返回False

所有测试用例都符合预期,而且完全遵守题目里的所有限制:没有修改原列表,没有创建额外列表变量,没有用in操作符,只用了递归和辅助函数。

备注:内容来源于stack exchange,提问作者Daniel

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.14 09:38:04