Программа, преобразующая префиксную запись в инфиксную - Lisp
Формулировка задачи:
Здравствуйте! Помогите с написанием программы, пожалуйста.
Задание:
Напишите программу, которая преобразует префиксную запись арифметического выражения в инфиксную с учетом того, что знак умножения может быть опущен.
Заранее благодарю!
Решение задачи: «Программа, преобразующая префиксную запись в инфиксную»
textual
Листинг программы
(defun f (w) (when w (if (atom w) w (infix w)))) (defun infix (w &optional ac (p (car w)) (d (cdr w))) (if (cdr d) (infix (cdr d) (nconc ac (list (f (car d)) p)) p (cdr d)) (nconc ac (list (f (car d)))))) > (infix '(* (+ 3 4 6) (- 1 2 3) 8 9)) ((3 + 4 + 6) * (1 - 2 - 3) * 8 * 9)
Объяснение кода листинга программы
В коде представлена функция преобразования префиксной записи в инфиксную.
- Функция
f
принимает один аргументw
и проверяет, является ли он атомом. Если это так, она возвращает его. В противном случае она вызывает функциюinfix
с аргументамиw
,ac
,p
иd
, гдеac
— результат вызова функцииf
для первого элемента спискаw
,p
— результат вызова функцииf
для последнего элемента спискаw
, аd
— остаток спискаw
. - Функция
infix
принимает аргументыw
,ac
,p
иd
. Еслиd
не является пустым списком, она вызывает функциюinfix
рекурсивно дляcdr
d
с аргументамиac
,p
иd
, с добавлением результата вызова функцииf
дляcar
d
вac
. Затем она добавляет результат вызова функцииf
дляcar
d
вac
. Еслиd
пуст, она возвращаетac
. - Вызывается функция
infix
с аргументом '( (+ 3 4 6) (- 1 2 3) 8 9)', где первый элемент списка — '(', второй элемент списка — '(+ 3 4 6)', третий элемент списка — '(- 1 2 3)', и четвертый элемент списка — '8 9)'. - Функция
infix
вызывается рекурсивно дляcdr
аргумента, который является списком '(+ 3 4 6)', с аргументамиac
,p
иd
, гдеac
— пустой список,p
— результат вызова функцииf
для '3', аd
— остаток списка '(+ 4 6)'. - Функция
infix
вызывается рекурсивно дляcdr
аргумента, который является списком '(+ 4 6)', с аргументамиac
,p
иd
, гдеac
— результат вызова функцииf
для '3',p
— результат вызова функцииf
для '4', аd
— остаток списка '6'. - Функция
infix
вызывается рекурсивно дляcdr
аргумента, который является списком '6', с аргументамиac
,p
иd
, гдеac
— результат вызова функцииf
для '3',p
— результат вызова функцииf
для '4', аd
— результат вызова функцииf
для '6'. - Функция
infix
вызывается рекурсивно дляcdr
аргумента, который является пустым списком, с аргументамиac
,p
иd
, гдеac
— результат вызова функцииf
для '3',p
— результат вызова функцииf
для '4', аd
— результат вызова функцииf
для '6'. - Результатом является список '((3 + 4 + 6) (1 - 2 - 3) 8 * 9)', который выводится на экран.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д