Цикл в цикле - Lisp
Формулировка задачи:
(DEFUN F (list1 list2)
(SETQ list3 '())
(do (( i list1 ()))
((NULL list1) list3)
((SETF S1 (CAR i)) (CDR i)
(do
((j list2 () ))
((NULL list2) list3)
((SETF S2 (CAR j)) (CDR j) (if (EQUAL S1 S2) (CONS S2 list3)))))))Решение задачи: «Цикл в цикле»
(defun sym-diff (lst1 lst2) (let ((r nil)) (dolist (i lst1 t) (when (not (member i lst2)) (push i r))) (dolist (i lst2 r) (when (not (member i lst1)) (push i r))))) ==> SYM-DIFF (sym-diff '(a b c d e f g) '(e f g h i j k l)) ==> (L K J I H D C B A)
Объяснение кода листинга программы
В данном коде реализована функция sym-diff, которая принимает два списка lst1 и lst2 и возвращает список, содержащий элементы, которые есть в lst1, но отсутствуют в lst2.
Функция использует два вложенных цикла dolist. Первый цикл проходит по каждому элементу lst1. Для каждого элемента i в lst1 проверяется, присутствует ли он в lst2 с помощью функции member. Если элемент отсутствует в lst2, он добавляется в конец результирующего списка r с помощью функции push.
Второй цикл проходит по каждому элементу lst2. Для каждого элемента i в lst2 проверяется, присутствует ли он в lst1 с помощью функции member. Если элемент отсутствует в lst1, он добавляется в конец результирующего списка r с помощью функции push.
В итоге, результирующий список r будет содержать элементы, которые есть в lst1, но отсутствуют в lst2.
Ответ:
- Функция
sym-diffпринимает два спискаlst1иlst2. - Вложенные циклы
dolistпроходят по каждому элементуlst1иlst2. - Для каждого элемента
iвlst1проверяется, присутствует ли он вlst2с помощью функцииmember. - Если элемент отсутствует в
lst2, он добавляется в конец результирующего спискаrс помощью функцииpush. - Для каждого элемента
iвlst2проверяется, присутствует ли он вlst1с помощью функцииmember. - Если элемент отсутствует в
lst1, он добавляется в конец результирующего спискаrс помощью функцииpush. - Результирующий список
rбудет содержать элементы, которые есть вlst1, но отсутствуют вlst2.