Два множества представлены списками. Найти объединение множеств - 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.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д