Преобразование польской записи - Lisp
Формулировка задачи:
Добрый день!
Помогите в решении задачи.
Разработать функцию, преобразующую польскую обратную запись, заданную в форме списка, в арифметическое выражение.
Например:
Вход: (- * 3 2 5)
Выход: (3 * 2 - 5)
Решение задачи: «Преобразование польской записи»
textual
Листинг программы
(defun prefix-infix (w &optional ac &aux (a (car w)) (d (cdr w))) (if d (if (numberp a) (cons a (cons (car ac) (prefix-infix d (cdr ac)))) (prefix-infix d (cons a ac))) w)) > (prefix-infix '(- * 3 2 5)) (3 * 2 - 5)
Объяснение кода листинга программы
В коде представлена функция с именем prefix-infix, которая преобразует польскую запись в обратную польскую запись (по сути, это обратный процесс выражения математических операций).
Список элементов кода с номерами до 20:
(defun prefix-infix (w &optional ac &aux (a (car w)) (d (cdr w)))(if d(if (numberp a)(cons a (cons (car ac) (prefix-infix d (cdr ac))))(prefix-infix d (cons a ac))))))(prefix-infix '(- * 3 2 5))(3 * 2 - 5)Вот что происходит в коде:- Функция
prefix-infixопределена с помощьюdefun. - Код начинается с проверки
d. Еслиdнеnil, то выполняется блок кода внутриif. - Внутри блока кода проверяется, является ли
aчислом. Если да, то выполняется следующий блок кода. - В этом блоке кода создается новая функция
cons, которая добавляетaв начало списка, за которым следуетcar ac. Затем вызываетсяprefix-infixс аргументамиdиcdr ac. - Если
aне является числом, то вызываетсяprefix-infixс аргументамиdиcons a ac. - Код завершается.
- Вызывается функция
prefix-infixс аргументом'(- * 3 2 5). - Результатом является
(3 * 2 - 5). Обратите внимание, что код преобразует польскую запись в обратную польскую запись, но не выполняет фактические вычисления. Для выполнения вычислений необходимо добавить дополнительный код.