Два множества представлены списками. Найти объединение множеств - Lisp
Формулировка задачи:
Два множества представлены списками. Найти объединение множеств.
Нужно сделать эту задачу циклами без рекурсии, взял из учебника функцию проверки элемента
a
в спискеl
(defun in (a l) (loop ((null l) nil) ; элемент не может принадлежать пустому множеству ((eq a (car l)) t) ; элемент принадлежит множеству, если в нем содержится (setq l (cdr l)) ; продолжаем проверку )) но выдает ошибку : *** - SYSTEM::%EXPAND-FORM: (NULL L) should be a lambda expression Хочу засунуть в функцию union (defun union (a b) (let ((buf nil)) (loop ((null a) b) ((null b) a) (if (in (car a) b) nil (push (car a) buf)) (setq a (cdr a)) ) (reverse buf) ))
Решение задачи: «Два множества представлены списками. Найти объединение множеств»
textual
Листинг программы
(defun union-set (s1 s2) (let ((r s1)) (dolist (a s2 r) (unless (member a s1) (push a r))))) ==> UNION-SET (union-set '(1 2 3 4 5) '(2 3 4 6 7 8 9)) ==> (9 8 7 6 1 2 3 4 5)
Объяснение кода листинга программы
В этом коде функция UNION-SET принимает два аргумента — списки S1 и S2. Она возвращает список, содержащий все элементы из обоих списков, которые не содержатся в первом списке. Сначала функция инициализирует пустой список R, который будет содержать результат. Затем она перебирает каждый элемент из второго списка S2. Если элемент не содержится в первом списке S1, он добавляется в конец списка R с помощью функции PUSH. В итоге, список R будет содержать все элементы из обоих списков, которые не содержатся в первом списке. Вернувшийся результат — это список R.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д