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

递归实现带括号算术表达式求值:多连续括号计算错误求助

问题分析

你的代码核心问题在于括号层级的管理逻辑混乱,尤其是连续括号场景下,bracketcount没有被用来正确跟踪当前所处的括号层级,导致递归返回后无法判断是否需要继续处理后续字符,或是应该退出当前层级。此外,连续左括号的处理逻辑、递归返回后的字符读取逻辑也存在漏洞,导致多括号表达式计算错误。

修正后的代码

主函数(仅微调)

#include <stdio.h>

int operator(int num1, int num2, char op);
int elevator(int current_num, int bracket_level, char current_char);

int main() {
    printf("enter an expression:\n");
    char input_char;

    scanf(" %c", &input_char);
    if (input_char == '(') {
        scanf(" %c", &input_char);
        int result = elevator(0, 1, input_char);
        printf("result: %d\n", result);
    } else {
        printf("invalid expression: must start with '('\n");
    }

    return 0;
}

递归计算函数(核心修正)

int elevator(int current_num, int bracket_level, char current_char) {
    int num = current_num;
    char op;

    // 处理当前字符是数字的情况
    if (current_char >= '0' && current_char <= '9') {
        num = current_char - '0';
        scanf(" %c", &current_char);
    }

    // 遇到右括号,当前层级闭合,返回当前数值
    if (current_char == ')') {
        bracket_level--;
        return num;
    }

    // 读取运算符
    if (current_char == '+' || current_char == '-' || current_char == '*' || current_char == '/') {
        op = current_char;
        scanf(" %c", &current_char);
    } else {
        printf("invalid operator\n");
        return 0;
    }

    int num2;
    // 处理下一个元素是左括号的情况:进入递归计算子表达式
    if (current_char == '(') {
        bracket_level++;
        // 递归计算子括号内的结果
        num2 = elevator(0, bracket_level, getchar());
        // 读取子表达式结束后的右括号
        scanf(" %c", &current_char);
        // 处理连续的右括号,回到当前层级
        while (current_char == ')' && bracket_level > 1) {
            bracket_level--;
            scanf(" %c", &current_char);
        }
    } else if (current_char >= '0' && current_char <= '9') {
        num2 = current_char - '0';
        scanf(" %c", &current_char);
    } else {
        printf("invalid character\n");
        return 0;
    }

    // 按从左到右顺序计算当前结果
    int sum = operator(num, num2, op);

    // 未到当前层级结尾,继续处理后续表达式;否则返回结果
    if (current_char != ')') {
        return elevator(sum, bracket_level, current_char);
    } else {
        bracket_level--;
        return sum;
    }
}

运算符函数(无修改)

int operator(int num1, int num2, char op) {
    switch (op) {
        case '+': return num1 + num2;
        case '-': return num1 - num2;
        case '*': return num1 * num2;
        case '/': return num1 / num2;
        default: return 0; // 处理非法运算符
    }
}
关键修改点说明
  1. 括号层级精准跟踪:

    • 每遇到左括号(,bracket_level加1;每遇到右括号),bracket_level减1,严格对应括号嵌套层级。
    • 从子递归返回后,通过循环处理连续右括号,确保层级回到当前递归的正确位置,不会遗漏后续表达式字符。
  2. 连续括号逻辑修复:

    • 移除原代码中错误的连续左括号循环,改为遇到单个左括号就立即递归,层级自动累加,避免跳过括号导致层级计算错误。
  3. 递归返回后字符处理优化:

    • 子表达式计算完成后,先读取对应的右括号,再检查是否有连续的右括号需要处理(对应外层括号闭合),保证后续字符读取逻辑正确。
  4. 移除冗余层级修改:

    • 删除原代码中随意减少bracketcount的逻辑,仅在遇到右括号或递归返回时根据实际情况调整层级,避免层级混乱。
测试验证

针对你提到的多连续括号示例:

  • 输入(2*((3+4)-(6/2))),计算过程:(3+4)=7 → 7-(6/2)=4 → 2*4=8,最终输出8。
  • 输入((2*3+4)-(6/2)),计算过程:(2*3+4)=10 → 10-(6/2)=7,最终输出7。

内容的提问来源于stack exchange,提问作者דולב מנג'ם

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 12:35:12