Функция объединения двух списков - Lisp
Формулировка задачи:
Добрый день.
Помогите пожалуйста решить такую задачу :
Разработать функцию, находящую теоретико-множественное объединение двух списков.
Например:
Вход: (1 2 3 4 5), (4 5 6 7).
Выход: (1 2 3 4 5 6 7).
Спасибо за внимание.
Решение задачи: «Функция объединения двух списков»
textual
Листинг программы
(defun union* (set1 set2) (append set1 (remove-if #'(lambda (x) (member x set1)) set2))) ==> union* (union* '(1 2 3) '(2 3 4)) ==> (1 2 3 4) (defun union$ (set1 set2) ;; HomeLisp (let ((res set1)) (iter (for x in set2) (unless (member x set1) (collecting x into res))) res)) ==> union$ (union$ '(1 2 3) '(2 3 4)) ==> (1 2 3 4) (defun union& (set1 set2) ;; HomeLisp (setof (append set1 set2))) ==> union& (union& '(1 2 3) '(2 3 4)) ==> (1 2 3 4)
Объяснение кода листинга программы
В данном коде представлено три функции, которые выполняют объединение двух множеств (списков):
union*- реализует объединение с помощью функцииappendи удаляет дубликаты с помощью функцииremove-ifи лямбда-функции, которая проверяет наличие элемента в первом множестве.union$- реализует объединение с помощью цикла и функцииmember, которая проверяет наличие элемента во втором множестве.union&- реализует объединение с помощью функцииsetofи операцииappend. Для примера, все три функции применяются к двум спискам(1 2 3)и(2 3 4), и возвращают результат(1 2 3 4).