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