Работа с многоуровневыми списками - 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)))
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д