Создать список атомов, которые есть в первым списке, но нету во втором - Lisp

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

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

Здраствуйте!В данный момент начал изучать лисп и столкнулся с проблемой в решение задачи: К примеру есть два списка из случайных атомов,используя рекурсию надо создать список атомов которые есть в первым списке но нету во втором, учитывая все атомы всех подсписков обоих списковю Буду очень блогодарен за помощь

Решение задачи: «Создать список атомов, которые есть в первым списке, но нету во втором»

textual
Листинг программы
(defun flat (lst)
 (cond ((null lst) nil)
       ((atom (car lst)) (cons (car lst) (flat (cdr lst))))
       (t (append (flat (car lst)) (flat (cdr lst)))))) 
 
==> FLAT
 
(flat '(a b ((c d))))
 
==> (A B C D)
 
(defun set-of (lst)
  (cond ((null lst) nil)
        (t (cons (car lst) (set-of (remove (car lst) (cdr lst)))))))
 
==> SET-OF
 
(set-of '(1 2 3 1 2 3))
 
==> (1 2 3)
 
(defun task (lst1 lst2)
  (let ((s1 (set-of (flat lst1)))
        (s2 (set-of (flat lst2))))
   (remove-if (lambda (x) (member x s2)) s1)))
 
==> TASK
 
(task '(1 2 3 4) '(3 4 5 6))
 
==> (1 2)

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

В коде реализованы три функции:

  1. flat — принимает на вход список lst и возвращает список, полученный путём применения функции car к каждому элементу исходного списка, пока не будет достигнуто окончание списка. Если элемент является атомом, то он добавляется в результирующий список.
  2. set-of — принимает на вход список lst и возвращает список, содержащий все уникальные элементы из lst.
  3. task — принимает на вход два списка lst1 и lst2 и возвращает список, содержащий все элементы из lst1, которые отсутствуют в lst2.

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

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