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

如何用递归实现括号有效性校验及现有代码失效原因分析

原有代码失效原因分析
  • 计数逻辑完全错误:你当前写的if "(" in s是判断剩余整个子串中是否存在左括号,而不是判断当前遍历的第一个字符是否为左括号,每一轮都会错误地累加/减计数。
  • 计数没有传递到下一层递归:你调用is_valid_paren(s[1:])时没有传入计算后的cnt参数,每一层递归的cnt都会重置为默认值0,全局计数完全不生效。
  • 缺少边界判断:没有判断cnt中途为负的情况(出现右括号早于左括号的场景直接就可以判定无效),遍历结束后也没有判断最终cnt是否为0(即左右括号数量是否相等),只要遍历完所有字符无论计数结果都会返回True。

你提到的部分输入返回正确完全是巧合,本质是原有逻辑完全不满足校验要求。

符合要求的递归实现(无循环)
def is_valid_paren(s, cnt=0):
    # 中途计数为负,说明右括号多于左括号,直接无效
    if cnt < 0:
        return False
    # 遍历完所有字符,判断左右括号数量是否相等
    if s == "":
        return cnt == 0
    # 仅根据当前第一个字符更新计数
    current_char = s[0]
    if current_char == '(':
        new_cnt = cnt + 1
    elif current_char == ')':
        new_cnt = cnt - 1
    else:
        # 非括号字符不影响计数
        new_cnt = cnt
    # 传递新的计数到下一层递归
    return is_valid_paren(s[1:], new_cnt)

上述实现完全基于递归逻辑,没有使用任何循环,支持忽略非括号字符的校验,覆盖所有规则要求:

  • 中途出现右括号多于左括号的情况直接返回False
  • 遍历结束后校验左右括号数量是否相等
  • 仅处理括号字符,其他字符不影响校验结果

内容的提问来源于stack exchange,提问作者sds

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 02:54:02