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

Python递归表达式计算函数的括号处理异常问题求助

递归表达式计算函数的问题修复

问题现象

  • 输入含方括号的表达式时,仅解析方括号内内容,忽略前后部分
  • 输入[2+2]+[2+2]返回None
  • 输入[2+3]*2仅输出括号内结果5

原代码

def divide(a, b):
    return a/b
def pow(a, b):
    return a**b
def addA(a, b):
    return a+b
def subA(a, b):
    return a-b
def mul (a, b):
    return a*b
operators = {
  '+': addA,
  '-': subA,
  '*': mul,
  '/': divide,
  '^' : pow,
}

def calculate(s):
    if s.isdigit():
        return float(s)
    elif '[' in s:
        start = s.index('[')
        end = s.rindex(']')
        return calculate(s[start + 1:end])
    for c in operators.keys():
        left, operator, right = s.partition(c)
        if operator in operators:
            return operators[operator](calculate(left), calculate(right))

calc = input("Type calculation:\n")
print("Answer: " + str(calculate(calc)))

问题根源

  1. 方括号处理逻辑错误:只要表达式包含[,就直接截取首尾括号内的内容返回,完全忽略括号外的运算符和操作数,导致外部运算被丢弃。
  2. 无运算符优先级处理:按字典插入顺序遍历运算符,会导致加减先于乘除计算,不符合数学规则;同时partition仅提取第一个匹配的运算符,无法处理右结合的幂运算。
  3. 无匹配分支返回None:当表达式无法匹配数字、方括号或运算符时,函数无返回值,默认返回None。

修复后的代码

def divide(a, b):
    return a / b

def pow(a, b):
    return a ** b

def addA(a, b):
    return a + b

def subA(a, b):
    return a - b

def mul(a, b):
    return a * b

# 按运算符优先级从高到低排序,优先级:^ > *、/ > +、-
operators = [
    ('^', pow),
    ('*', mul),
    ('/', divide),
    ('+', addA),
    ('-', subA),
]

def calculate(s):
    # 去除空格,增强输入兼容性
    s = s.replace(" ", "")
    
    # 判断是否为纯数字(支持小数)
    if s.replace('.', '', 1).isdigit():
        return float(s)
    
    # 处理方括号:优先解析最内层括号,计算后替换回原表达式
    if '[' in s:
        # 定位最内层的[及其对应的]
        start = s.rindex('[')
        end = s.index(']', start)
        # 计算括号内结果并替换原括号部分,递归处理新表达式
        inner_result = calculate(s[start+1:end])
        return calculate(s[:start] + str(inner_result) + s[end+1:])
    
    # 按优先级遍历运算符,处理右结合的幂运算时从右往左查找
    for op, func in operators:
        if op == '^':
            idx = s.rfind(op)
        else:
            idx = s.find(op)
        # 跳过表达式开头的负号(如-3+5)
        if idx == 0:
            continue
        if idx != -1:
            left = s[:idx]
            right = s[idx+1:]
            return func(calculate(left), calculate(right))
    
    # 表达式无效时抛出异常
    raise ValueError(f"无法解析的表达式: {s}")

try:
    calc = input("Type calculation:\n")
    result = calculate(calc)
    # 整数结果转为整数格式输出,否则保留浮点数
    print("Answer: " + (str(int(result)) if result.is_integer() else str(result)))
except ValueError as e:
    print(f"错误: {e}")

验证示例

  • 输入[2+2]+[2+2],输出:Answer: 8
  • 输入[2+3]*2,输出:Answer: 10
  • 输入[3^2]+[10/2],输出:Answer: 14

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 16:46:09