Эффективные методы вычисления математических выражений: подробное руководство

Вычисление математических выражений — фундаментальная задача во многих вычислительных приложениях. Создаете ли вы калькулятор, реализуете программу научных вычислений или разрабатываете систему символьной алгебры, наличие эффективных методов вычисления математических выражений имеет решающее значение. В этой статье мы рассмотрим различные подходы к вычислению математических выражений, приведя примеры кода для каждого метода. Давайте погрузимся!

  1. Использование встроенных функций языка.
    Многие языки программирования предоставляют встроенные функции для вычисления математических выражений. Эти функции часто поддерживают базовые операции, такие как сложение, вычитание, умножение и деление. Вот пример на Python с использованием функции eval():
expression = "2 + 3 * 4"
result = eval(expression)
print(result)  # Output: 14
  1. Разбор рекурсивного спуска.
    Разбор рекурсивного спуска — это метод анализа сверху вниз, обычно используемый для вычисления математических выражений. Он предполагает разбиение выражения на более мелкие подвыражения и их рекурсивное вычисление. Вот пример на Python:
def evaluate_expression(expression):
    tokens = expression.split()
    def term():
        nonlocal tokens
        t = int(tokens[0])
        tokens = tokens[1:]
        return t
    def expression():
        nonlocal tokens
        result = term()
        while tokens and tokens[0] in ['+', '-']:
            op = tokens[0]
            tokens = tokens[1:]
            if op == '+':
                result += term()
            else:
                result -= term()
        return result
    return expression()
expression = "2 + 3 * 4"
result = evaluate_expression(expression)
print(result)  # Output: 14
  1. Алгоритм сортировочной станции.
    Алгоритм сортировочной станции, разработанный Эдсгером Дейкстрой, представляет собой классический метод анализа и оценки математических выражений. Он использует стеки для обработки приоритета операторов и ассоциативности. Вот пример на Python:
def evaluate_expression(expression):
    operators = {'+': 1, '-': 1, '*': 2, '/': 2}  # Operator precedence
    def apply_operator(operators_stack, values_stack):
        operator = operators_stack.pop()
        right_operand = values_stack.pop()
        left_operand = values_stack.pop()
        if operator == '+':
            result = left_operand + right_operand
        elif operator == '-':
            result = left_operand - right_operand
        elif operator == '*':
            result = left_operand * right_operand
        elif operator == '/':
            result = left_operand / right_operand
        values_stack.append(result)
    def evaluate(expression):
        operators_stack = []
        values_stack = []
        for token in expression.split():
            if token.isdigit():
                values_stack.append(int(token))
            elif token in operators:
                while operators_stack and operators_stack[-1] != '(' and operators[token] <= operators[operators_stack[-1]]:
                    apply_operator(operators_stack, values_stack)
                operators_stack.append(token)
            elif token == '(':
                operators_stack.append(token)
            elif token == ')':
                while operators_stack[-1] != '(':
                    apply_operator(operators_stack, values_stack)
                operators_stack.pop()
        while operators_stack:
            apply_operator(operators_stack, values_stack)
        return values_stack[0]
    return evaluate(expression)
expression = "2 + 3 * 4"
result = evaluate_expression(expression)
print(result)  # Output: 14
  1. Обратная польская нотация (RPN):
    Обратная польская нотация, также известная как постфиксная нотация, представляет собой математическую запись, в которой операторы располагаются после операндов. RPN хорошо подходит для оценки выражений с использованием стекового подхода. Вот пример на Python:
def evaluate_expression(expression):
    stack = []
    for token in expression.split():
        if token.isdigit():
            stack.append(int(token))
        else:
            operand2 = stack.pop()
            operand1 = stack.pop()
            if token == '+':
                result = operand1 + operand2
            elif token == '-':
                result = operand1 - operand2
            elif token == '*':
                result = operand1 * operand2
            elif token == '/':
                result = operand1 / operand2
            stack.append(result)
    return stack[0]
expression = "2 3 4 * +"
result = evaluate_expression(expression)
print(result)  # Output: 14