Задание со спискоразрушающими функциями - Lisp
Формулировка задачи:
Доброго времени суток
Помогите пожалуйста с заданием:
- Используя спискоразрушающие функции RPLACA и RPLACD, вставить новый элемент за каждым вхождением заданного элемента в список.
И все бы ничего, но кроме rplaca и rplacd можно использовать простейшие функции Лиспа и рекурсии. Никаких циклов и прочего.
Заранее благодарю!
Решение задачи: «Задание со спискоразрушающими функциями»
textual
Листинг программы
(defun task (lst a x &optional (f (cdr lst))) (cond ((null lst) nil) ((eq (car lst) a) (rplacd f (cons x (cdr lst))) (task (cddr lst) a x (cdr lst))) (t (task (cdr lst) a x (cdr lst))))) ==> task (setq *z* '(1 2 3 4 2 5 2)) ==> (1 2 3 4 2 5 2) (task *z* 2 '!) ==> NIL *z* ==> (1 2 ! 3 4 2 ! 5 2 !)
Объяснение кода листинга программы
Этот код на языке Lisp представляет собой функцию с именем task, которая принимает три аргумента: lst, a и x. Аргумент lst является списком, который может содержать любое количество элементов. Аргументы a и x являются фиксированными значениями.
Функция task работает следующим образом:
- Если
lstравноnil, то возвращаетсяnil. - Если
carlstравноa, тоfзаменяется наconsx(cdrlst). - Если
carlstне равноa, тоtaskвызывается рекурсивно с аргументами(cdrlst),aиx. - Если
carlstне равноa, тоtaskвызывается рекурсивно с аргументами(cdrlst),aиx. В данном примере функцияtaskприменяется к списку*z*с аргументами2и'!'. После выполнения функции, список*z*будет выглядеть так:(1 2 ! 3 4 2 ! 5 2 !). Вот список переменных и их значений, используемых в коде: lst- список, содержащий элементы, которые нужно обработать.a- фиксированное значение, которое используется для сравнения сcarlst.x- фиксированное значение, которое добавляется в список после проверкиcarlst.f- переменная, которая используется для хранения результата вызова функцииcons.cdr- функция, которая используется для получения списка без первого элемента.null- функция, которая используется для проверки, является ли список пустым.eq- функция, которая используется для проверки, равны ли два значения.car- функция, которая используется для получения первого элемента списка.cons- функция, которая используется для создания нового элемента списка, содержащего значениеx.rplacd- функция, которая используется для замены значенияfна новый список, содержащий значениеx.t- логическое значение, которое используется в условном выражении.setq- функция, которая используется для присваивания значения переменной*z*.cddr- функция, которая используется для получения списка без первых двух элементов.'!'- строковое значение, которое используется в качестве аргумента функцииtask.nil- логическое значение, которое используется в качестве аргумента функцииtask.