Цикл в цикле - Lisp

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

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

Изначальна дана была задача: Функция, аргументами которой являются два списка, должна возвращать список, элементы которого являют только элементами входящие в один из списков. Хотела перебрать элементы с помощью do:
(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)))))))
Подскажите, пожалуйста, может я не совсем верно написала do, т. к. выдает ошибку при исполнении функции F

Решение задачи: «Цикл в цикле»

textual
Листинг программы
(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. Ответ:

  1. Функция sym-diff принимает два списка lst1 и lst2.
  2. Вложенные циклы dolist проходят по каждому элементу lst1 и lst2.
  3. Для каждого элемента i в lst1 проверяется, присутствует ли он в lst2 с помощью функции member.
  4. Если элемент отсутствует в lst2, он добавляется в конец результирующего списка r с помощью функции push.
  5. Для каждого элемента i в lst2 проверяется, присутствует ли он в lst1 с помощью функции member.
  6. Если элемент отсутствует в lst1, он добавляется в конец результирующего списка r с помощью функции push.
  7. Результирующий список r будет содержать элементы, которые есть в lst1, но отсутствуют в lst2.

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


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

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

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