Функции пересечения и разности списков - Lisp
Формулировка задачи:
Добрый День!!!!Помогите,пожалуйста!
Имеются функции пересечения и разности списков, но они работают только на внешнем уровне. Как сделать так, чтобы происходило пересечение и разность соответствующих уровней . Например, список 1: ( a s d ( f g 1 2 ( h ))), список 2: ( d f ( f g 1 (h k) ) )
пересечение : ( d (f g 1 (h)))
разность : (a s (2 (nil)))
(defun intersectionlist (list1 list2)
(cond ((null list1) nil)
((null list2) nil)
((member (car list1) list2)
(cons (car list1) (intersectionlist (cdr list1) list2)))
(t (intersectionlist (cdr list1) list2))))
(defun differencelist (list1 list2)
(cond
((null list1) nil)
((not (member (car list1) list2))
(cons (car list1) (differencelist (remove (car list1) list1) list2)))
(t (differencelist (cdr list1) list2))))Решение задачи: «Функции пересечения и разности списков»
textual
Листинг программы
;; racket-lang.org (define (intersect lst1 lst2) (for/list ([i lst1] #:when (member i lst2)) i)) (intersect '(1 2 3 4) '(3 4 5 6)) ;'(3 4) (define (difference lst1 lst2) (for/list ([i lst1] #:unless (member i lst2)) i)) (difference '(1 2 3 4) '(3 4 5 6)) ;'(1 2)
Объяснение кода листинга программы
- Функция
intersectпринимает два спискаlst1иlst2. - Функция использует цикл
for/listдля перебора каждого элементаiизlst1. - Внутри цикла, проверяется условие
#:when (member i lst2), которое истинно, если элементiприсутствует в спискеlst2. - Если условие истинно, элемент
iдобавляется в результирующий список. - В итоге, функция возвращает пересечение двух списков.
- Запускается функция
intersectс аргументами'(1 2 3 4)'и'(3 4 5 6)'. - Результатом выполнения функции будет список `'(3 4)', так как только эти элементы присутствуют в обоих списках.
- Функция
differenceпринимает два спискаlst1иlst2. - Функция использует цикл
for/listдля перебора каждого элементаiизlst1. - Внутри цикла, проверяется условие
#:unless (member i lst2), которое истинно, если элементiотсутствует в спискеlst2. - Если условие истинно, элемент
iдобавляется в результирующий список. - В итоге, функция возвращает разность двух списков.
- Запускается функция
differenceс аргументами'(1 2 3 4)'и'(3 4 5 6)'. - Результатом выполнения функции будет список
'(1 2)', так как только эти элементы присутствуют вlst1, но отсутствуют вlst2`.