Я изо всех сил пытался найти решение этой проблемы. Или, может быть, подход, который будет соответствовать моим условиям проблемы.
Мы представляем математические выражения с помощью классов, расположенных в иерархическом дереве. Вверху находится базовое математическое выражение, а внизу - двоичные, унарные, а под ними - все операторы, такие, что унарные представляют: отрицание, cos, sin. Двоичные: плюс, минус, деление, пау, лог.
В стороне у нас есть номер и переменная.
Пример выражения:
new Plus(new Plus(x , 5), 5) => x + 5 + 5
Все эти классы реализуют интерфейс с методами, которые обычно связаны с .math
.
Пример: оценить, назначить, получить. Эти методы работают рекурсивно благодаря иерархическому дереву.
Я также заметил, что это не обычное регулярное двоичное дерево. (Я прав?)
Все идет хорошо и гладко, пока мы не сделаем упрощение этих выражений.
Простое упрощение x * 0 => 0 просто.
Но я хочу упростить использование ассоциативности, дистрибутивности также ..
Например, данное (2 * x + 4 * x) + 5 + 2x даст мне 8x + 5.
Поэтому мне интересно, как подойти к этой проблеме.