Создать список атомов, которые есть в первым списке, но нету во втором - 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)
Объяснение кода листинга программы
В коде реализованы три функции:
- flat — принимает на вход список
lst
и возвращает список, полученный путём применения функции car к каждому элементу исходного списка, пока не будет достигнуто окончание списка. Если элемент является атомом, то он добавляется в результирующий список. - set-of — принимает на вход список
lst
и возвращает список, содержащий все уникальные элементы изlst
. - task — принимает на вход два списка
lst1
иlst2
и возвращает список, содержащий все элементы изlst1
, которые отсутствуют вlst2
.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д