Два множества представлены списками. Найти объединение множеств - 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.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

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

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