У меня есть математическое выражение, такое как cos(pi*cos(pi * sin(pi*y))), и я хочу его решить.
Нет, вы хотите оценить его. Решение говорит вам об условиях, при которых что-то верно. Оценка этого просто дает вам результирующее значение.
Я думаю, что лучший способ разобрать его — начать с конца строки.
Традиционный способ разбора подобных выражений — использование рекурсивного спуска. Он более общий и его гораздо проще реализовать. Поток управления выглядит примерно так:
Точно так же работает выражение C cos(M_PI * cos(M_PI * sin(M_PI * y)))
(предполагая, что π является обычной, но нестандартной константой).
Он вычисляется примерно справа налево (фактически изнутри наружу), но по-прежнему читается слева направо. Мы только что пометили временные значения для ясности.
Этот поток управления часто просто превращается в дерево, подобное
[cos of _]
|
[pi * _]
|
[cos of _]
|
[pi * _]
|
[sin of _]
|
[pi * y]
Но, очевидно, вы можете просто оценить результат один раз, если вам не нужно сохранить дерево на потом. (Обратите внимание, что это кривое дерево по-прежнему остается деревом, оно просто вырождается из-за того, как вложено ваше выражение).
...Что вы думаете об этом?
Проблема с вашим решением заключается в том, что оно ломается для разных структур вложенности, например.
cos( sin((pi * x) + y) + sin(y + (pi * x)) )
нельзя просто оценивать справа налево.
Не могли бы вы помочь мне реализовать код?
Отделите обработку строк (токенизацию) от синтаксического анализа и оценки. Гораздо проще рассуждать независимо о вашей обработке строк и вашей математике.
person
Useless
schedule
17.12.2015
int
. Затем выполните свое действие и вернитесь - person shapiro yaacov   schedule 17.12.2015cos(pi*atan(y)) + sin(pi*y)
, я не вижу преимущества в переворачивании строки. (Хотя в вашем исходном примере, по общему признанию, есть преимущество, потому что в перевернутой строке операции оказываются в том порядке, в котором они необходимы, и, выполняя их в этом порядке, вам нужна только одна временная переменная.) - person Jonas Schäfer   schedule 17.12.2015cos(pi)
можно записать как cos[pi], или cos(Pi), или cos(PI), или cos(3.14). Моя точка зрения состоит в том, чтобы, по крайней мере, начать с некоторых правил. - person CroCo   schedule 17.12.2015