Объединить 2 списка в один, элементы которого будут только те элементы, которые есть в первом, но нет во втором - Lisp

Узнай цену своей работы

Формулировка задачи:

Например '(1 2 4 7 8) '(3 5 8 2 0 5) Результат - '(1 4 7)

Решение задачи: «Объединить 2 списка в один, элементы которого будут только те элементы, которые есть в первом, но нет во втором»

textual
Листинг программы
(defun task (lst1 lst2)
  (remove-if (lambda (x) (member x lst2)) lst1))
 
==> TASK
(task '(1 2 4 7 8) '(3 5 8 2 0 5))
 
==> (1 4 7)
 
(defun task (lst1 lst2)
  (cond ((null lst1) nil)
        ((member (car lst1) lst2) (task (cdr lst1) lst2))
        (t (cons (car lst1) (task (cdr lst1) lst2)))))
 
==> TASK
 
(task '(1 2 4 7 8) '(3 5 8 2 0 5))
 
==> (1 4 7)

Объяснение кода листинга программы

В первом представленном фрагменте кода функция task принимает два аргумента: lst1 и lst2. Она возвращает новый список, который содержит только те элементы из lst1, которых нет в lst2. Для этого используется функция remove-if, которая удаляет элементы, удовлетворяющие заданному условию (в данном случае, элементы, которые присутствуют во втором списке). Во втором фрагменте кода функция task реализована с использованием cond. В первом условии проверяется, является ли lst1 пустым. Если это так, то возвращается nil. Во втором условии проверяется, есть ли первый элемент lst1 во втором списке. Если это так, то рекурсивно вызывается функция task с cdr lst1 и lst2. В третьем условии, если оба предыдущих условия не выполняются, то к результату рекурсивного вызова функции task добавляется первый элемент lst1. Таким образом, оба фрагмента кода выполняют одну и ту же задачу - объединяют два списка в один, оставляя только те элементы из первого списка, которых нет во втором.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

14   голосов , оценка 3.929 из 5
Похожие ответы