Работа с многоуровневыми списками - Lisp

Узнай цену своей работы

Формулировка задачи:

Добрый день! Есть программа, которая объединяет два многоуровневых списка и возвращает результат в виде одного списка. Подскажите, пожалуйста, как реализовать объединение на каждом уровне списка т.е в результате получать следующее: (unionnewlist '( a s d ( f g 1 2 ( h ))) '( d f ( f g 1 ) )--> (a s d f ( f g 1 2 ) (h))
(defun new_list (lst &optional (r nil))
  (cond ((null lst) r)
        ((atom (car lst)) (if (member (car lst) r) (new_list (cdr lst) r) (new_list (cdr lst) (cons (car lst) r))))
        (t (let ((r1 (new_list (car lst) r)))
             (new_list (cdr lst) r1))))) 
 
(defun unionlist (list1 list2)
  (cond ((null list1) list2)
        ((null list2) list1)
        ((member (car list1) list2) 
        (cons (car list1) (unionlist (cdr list1) (remove (car list1) list2))))
        (t (cons (car list1) (unionlist (cdr list1) list2))))) 

(defun unionnewlist (lst1 lst2)
  (let ((list1 (new_list lst1)) 
        (list2 (new_list lst2))) 
    (unionlist list1 list2)))

Решение задачи: «Работа с многоуровневыми списками»

textual
Листинг программы
(defun uni (lst1 lst2)
  (let ((l-atom-1 (remove-if-not 'atom lst1))
        (l-atom-2 (remove-if-not 'atom lst2))
        (l-lst-1  (remove-if-not 'listp lst1))
        (l-lst-2  (remove-if-not 'listp lst2)))
       (append (union l-atom-1 l-atom-2)
               (cond ((null l-lst-1) l-lst-2)
                     ((null l-lst-2) l-lst-1)
                     (t (mapcar #'uni l-lst-1 l-lst-2))))))
        
==> uni
 
(uni '(a s d (f g 1 2 (h))) '(d f (f g 1)))
 
==> (s a f d (2 1 g f (h)))

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


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

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

14   голосов , оценка 3.714 из 5