Продублировать символ в списке - 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
.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д