Преобразование польской записи - 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)
. Обратите внимание, что код преобразует польскую запись в обратную польскую запись, но не выполняет фактические вычисления. Для выполнения вычислений необходимо добавить дополнительный код.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д