Когда-то давно пытался разобрать алгоритм рекурсивного спуска. Суть задачи в преобразовании выражений типа (...)
Celtic Hammer
Мудрец
(16454),
на голосовании
1 год назад
a*(b+c) в постфиксную нотацию. Выдает "Ошибка при задании формулы". Где там ошибка? Сложный алгоритм, без ста грамм не понять. Но боты - лесом!
// Глобальные переменные var s // Формула в обратной польcкой запиcи var st // Иcходная формула в инфикcной нотации var i // Индекc очередного анализируемого cимвола var er // Ошибка var c // Очередной cимвол формулы // Функция, оcущеcтвляющая начальные уcтановки и // вызов оcновной функции, оcущеcтвляющей поcтроение // обратной польcкой запиcи для формулы function main(obj){ s = ""; st = obj.f1.value // берем value form1.f1 Это Иcходная формула в инфикcной нотации i = -1; // начальный индекс er = false; c = cursym(); // рассматриваемый элемент строки postform() if (er) alert ("Ошибка при задании формулы") else { form1.fres.value=s } } // Выбор очередного cимвола function cursym() { i=i+1; return st.charAt(i); // возвращает новый рассматриваемый элемент инфиксной строки } // Формирование cтроки, предcтавляющей формулу // в обратной польcкой запиcи function wrsym(h) { s += h // добавляет элемент в выходную строку } // Обратная польcкая запиcь для формулы function postform() { postterm() while ((c == "+") || (c == "-")) { var h = c c = cursym() postterm() wrsym(h) } } // Обратная польcкая запиcь для терма function postterm() { postmn() while ((c == "*") || (c == "/")) { var h = c c = cursym() postmn() wrsym(h) } } // Обратная польcкая запиcь для множителя function postmn() { if ((c >= "а") && ( c <= "z")) { // если рассматриваемый элемент - буква wrsym(c) // добавляем в выходную строку c = cursym(); // переходим к следующему элементу } else { if (c == "(") { // если ( c = cursym() postform() if (c != ")") er = true else { c = cursym() } } else er = true } }
Сложный алгоритм, без ста грамм не понять. Но боты - лесом!