Преобразование списка в множество - Lisp
Формулировка задачи:
Здравствуйте! Пытаюсь преобразовать список элементов в множество, причем список может содержать другие списки: (A B (A C (X B Y) A) D) -> (A B C X Y D). У меня почему-то последний элемент не входит в результирующий набор:
Подскажите, в чем ошибка? Заранее спасибо!
(defun build-set(l s) (cond ((null l) s) ((listp (car l)) (build-set (car l) s)) (t (build-set (cdr l) (adjoin (car l) s))) ) )
Решение задачи: «Преобразование списка в множество»
textual
Листинг программы
(defun make-line (lst) (cond ((null lst) nil) ((listp (car lst)) (append (make-line (car lst)) (make-line (cdr lst)))) (t (cons (car lst) (make-line (cdr lst)))))) ==> make-line (make-line '(1 2 3 (((a s d)) a s d) 2 3 1)) ==> (1 2 3 a s d a s d 2 3 1)
Объяснение кода листинга программы
В данном коде определён вспомогательный функтор make-line, который принимает на вход список lst и возвращает список, содержащий элементы из исходного списка lst, в котором все повторяющиеся элементы заменены на их подсписок, содержащий все вхождения элемента в исходном списке.
- Если lst — это пустой список, то возвращается nil.
- Если lst — это список, то рекурсивно вызывается make-line для первого элемента списка (car lst) и для списка, полученного без первого элемента (cdr lst). Полученные результаты объединяются с помощью функции append.
- Если lst — это не список, то элемент добавляется в начало результирующего списка, а затем вызывается make-line для оставшейся части списка (cdr lst). Пример использования: (make-line '(1 2 3 (((a s d)) a s d) 2 3 1)) ==> (1 2 3 a s d a s d 2 3 1)
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д