Входят ли атомы первого списка во второй - Lisp
Формулировка задачи:
Решение задачи: «Входят ли атомы первого списка во второй»
- (DEFUN SETOF (X)
- (COND ((NULL X) NIL)
- ((MEMBER (CAR X) (CDR X)) (SETOF (CDR X))) (T (CONS (CAR X) (SETOF (CDR X))))))
- (DEFUN FLATTEN (X)
- (COND ((NULL X) NIL)
- ((ATOM X) (LIST X))
- (T (APPEND (FLATTEN (CAR X)) (FLATTEN (CDR X))))))
- (print (setof '(1 2 3 2 3 2 2)))
Объяснение кода листинга программы
В этом коде определены две функции: SETOF и FLATTEN. Функция SETOF принимает один аргумент X и возвращает список, содержащий все элементы из X, которые встречаются более одного раза. Если X — это пустой список, то возвращается NIL. Если X — это не пустой список, то его первый элемент проверяется на наличие в оставшейся части списка. Если этот элемент найден, то он не включается в результат, а функция вызывается рекурсивно для оставшейся части списка. Если этот элемент не найден, то он включается в результат, который затем дополняется результатами вызова функции SETOF для оставшейся части списка. Если X — это атом, то он включается в результат. Функция FLATTEN принимает один аргумент X и возвращает список, содержащий все элементы из X, приведенные к одному уровню. Если X — это пустой список, то возвращается NIL. Если X — это не пустой список, то его первый элемент проверяется на то, является ли он атомом. Если это так, то он включается в результат. Если это не так, то вызывается рекурсивно функция FLATTEN для этого элемента и результат этого вызова присоединяется к результату. Затем вызывается рекурсивно функция FLATTEN для оставшейся части списка и результат этого вызова присоединяется к результату. В конце кода вызывается функция print для вывода списка (1 2 3 2 3 2 2).
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д