Задание со спискоразрушающими функциями - 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
. - Если
car
lst
равноa
, тоf
заменяется наcons
x
(cdr
lst)
. - Если
car
lst
не равноa
, тоtask
вызывается рекурсивно с аргументами(cdr
lst)
,a
иx
. - Если
car
lst
не равноa
, тоtask
вызывается рекурсивно с аргументами(cdr
lst)
,a
иx
. В данном примере функцияtask
применяется к списку*z*
с аргументами2
и'!'
. После выполнения функции, список*z*
будет выглядеть так:(1 2 ! 3 4 2 ! 5 2 !)
. Вот список переменных и их значений, используемых в коде: lst
- список, содержащий элементы, которые нужно обработать.a
- фиксированное значение, которое используется для сравнения сcar
lst
.x
- фиксированное значение, которое добавляется в список после проверкиcar
lst
.f
- переменная, которая используется для хранения результата вызова функцииcons
.cdr
- функция, которая используется для получения списка без первого элемента.null
- функция, которая используется для проверки, является ли список пустым.eq
- функция, которая используется для проверки, равны ли два значения.car
- функция, которая используется для получения первого элемента списка.cons
- функция, которая используется для создания нового элемента списка, содержащего значениеx
.rplacd
- функция, которая используется для замены значенияf
на новый список, содержащий значениеx
.t
- логическое значение, которое используется в условном выражении.setq
- функция, которая используется для присваивания значения переменной*z*
.cddr
- функция, которая используется для получения списка без первых двух элементов.'!'
- строковое значение, которое используется в качестве аргумента функцииtask
.nil
- логическое значение, которое используется в качестве аргумента функцииtask
.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д