Продублировать символ в списке - Lisp
Формулировка задачи:
Решение задачи: «Продублировать символ в списке»
(defun task (lst a) (let ((c (- (length lst) (length (remove a lst))))) (cond ((zerop c) lst) ((= c 1) (apply 'append (mapcar #'(lambda (x) (if (eq x a) (list a a) (list x))) lst))) (t nil)))) ==> task (task '(1 2 3 4 g 5 6 7) 'g) ==> (1 2 3 4 g g 5 6 7) (task '(1 2 3 4 g 5 g 6 7) 'g) ==> NIL (task '(1 2 3 4 5 6 7) 'g) ==> (1 2 3 4 5 6 7)
Объяснение кода листинга программы
В коде определена функция task
, которая принимает два аргумента: список lst
и символ a
.
Список lst
продублирует символ a
в указанном месте. Для этого используется функция remove
, которая удаляет все вхождения символа a
из списка lst
. Затем с помощью функции length
вычисляется разница между длиной исходного списка и длиной списка без символа a
.
Если разница равна нулю, то список lst
уже содержит символ a
в нужном количестве, и функция возвращает его.
Если разница равна единице, то с помощью функции append
объединяются два списка: lst
и список, содержащий символ a
. Затем с помощью функции mapcar
создается новый список, в котором каждый элемент исходного списка lst
заменяется на пару символов a
, если он равен символу a
, и остаётся неизменным в противном случае.
Если разница больше единицы, то функция возвращает nil
.
Примеры использования функции task
показывают, что если передать в качестве аргумента список, в котором уже есть символ a
в нужном количестве, то список возвращается без изменений. Если же символ a
отсутствует или присутствует в неправильном количестве, то в список вставляются недостающие или лишние символы a
.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д