Преобразование списка в множество - 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, в котором все повторяющиеся элементы заменены на их подсписок, содержащий все вхождения элемента в исходном списке.

  1. Если lst — это пустой список, то возвращается nil.
  2. Если lst — это список, то рекурсивно вызывается make-line для первого элемента списка (car lst) и для списка, полученного без первого элемента (cdr lst). Полученные результаты объединяются с помощью функции append.
  3. Если 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)

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


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

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

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