вопрос: предположим, что у меня есть функция ввода, например sin(2-cos(3*A/B)^2.5)+0.756*(C*D+3-B)
, заданная с помощью BNF, я буду анализировать ввод с использованием алгоритма рекурсивного спуска, а затем как я могу использовать или изменить алгоритм Дейкстры для обработки данной функции? Мне нужно выполнить его с помощью sin | cos | sqrt | ln, где алгоритм Дейкстры должен выполнять работу.Алгоритм и функции Дейкстры
EDIT: Может быть, я должен спросить также: Какова наилучшая практика или структура данных для представления данной функции?
EDIT: Входной набор может быть приобретен как:
C 0.01 .01 .02 .04 .08 .02 .02 .04
A .016 .008 .116 .124 .147 .155 .039 .023
D .012 .025 .05 .1 .1 .1 .025 .012000 .012
B .007 .007 .015 .022 .029 .036 .044 .051 .058 .066 .073 .080
EDIT: Шунтирование Ярд алгоритм для преобразования функции входа в RPN, но как я могу продлить его принять другую функцию, как грех | cos | sqrt | пер? Предоставляет ли рекурсивный спуск необходимое расширение для Shunting Yard?
Я не вижу, какой алгоритм dijkstra имеет отношение к разбору выражения. Вы хотите узнать расстояние между узлами в дереве разбора? Если да, зачем? – sepp2k
@ sepp2K: Это не связано с разбором, я буду анализировать с использованием рекурсивного спуска, но проблема заключается в выполнении этой функции с переменными входами. –
@baris_a, после того, как вы построили дерево синтаксиса, вы можете оценить его с помощью (обычно) рекурсивной функции 'eval'. –