Отфильтровать разность списков по заданному предикату - Lisp

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

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

Задача: Напишите функцию (f X Y P), которая возвращает список Z т.е. список, содержащий элементы, имеющиеся в одном списке, но отсутствующие в другом и удовлетворяющие некоторому предикату P. Можно с пояснением пожалуйста, не смог сделать, мозгов не хватает

Решение задачи: «Отфильтровать разность списков по заданному предикату»

textual
Листинг программы
(defun task (w v p)
  (let ((r nil))
    (dolist (a w (reverse r))
      (when (and (not (member a v)) (funcall p a)) (push a r)))))
 
==> TASK
 
(task '(1 2 3 4 5 6 7) '(1 2 3) #'oddp)
 
==> (5 7)

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

В коде определена функция task, которая принимает три аргумента: w, v и p. Первый аргумент w — это список, который необходимо отфильтровать. Второй аргумент v — это список, который содержит элементы, которые должны остаться в итоговом списке. Третий аргумент p — это предикат, который определяет условие фильтрации. В функции используется let для создания переменной r, которая инициализируется как nil. Затем используется dolist, который перебирает элементы из w в обратном порядке и добавляет каждый элемент, который удовлетворяет предикату p, в r с помощью push. Наконец, функция возвращает результат r. При вызове функции task с аргументами '(1 2 3 4 5 6 7)', '(1 2 3)' и #'oddp возвращается список (5 7), что является элементами из первого аргумента, которые не присутствуют во втором аргументе и удовлетворяют предикату oddp.

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

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