Программа, преобразующая префиксную запись в инфиксную - 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рекурсивно дляcdrdс аргументамиac,pиd, с добавлением результата вызова функцииfдляcardвac. Затем она добавляет результат вызова функцииfдляcardв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)', который выводится на экран.