Вычисление математических выражений — фундаментальная задача во многих вычислительных приложениях. Создаете ли вы калькулятор, реализуете программу научных вычислений или разрабатываете систему символьной алгебры, наличие эффективных методов вычисления математических выражений имеет решающее значение. В этой статье мы рассмотрим различные подходы к вычислению математических выражений, приведя примеры кода для каждого метода. Давайте погрузимся!
- Использование встроенных функций языка.
Многие языки программирования предоставляют встроенные функции для вычисления математических выражений. Эти функции часто поддерживают базовые операции, такие как сложение, вычитание, умножение и деление. Вот пример на Python с использованием функцииeval()
:
expression = "2 + 3 * 4"
result = eval(expression)
print(result) # Output: 14
- Разбор рекурсивного спуска.
Разбор рекурсивного спуска — это метод анализа сверху вниз, обычно используемый для вычисления математических выражений. Он предполагает разбиение выражения на более мелкие подвыражения и их рекурсивное вычисление. Вот пример на 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
- Алгоритм сортировочной станции.
Алгоритм сортировочной станции, разработанный Эдсгером Дейкстрой, представляет собой классический метод анализа и оценки математических выражений. Он использует стеки для обработки приоритета операторов и ассоциативности. Вот пример на 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
- Обратная польская нотация (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