Подсписки с повторяющимися элементами - Lisp
Формулировка задачи:
Народ выручайте как реализовать?
Написать функцию, которая определяет, содержит ли список с подсписками повторяющиеся элементы.
Заранее благодарен.
Решение задачи: «Подсписки с повторяющимися элементами»
textual
Листинг программы
(defun deep-twins (w) (twins (flatten w))) (defun flatten (w &optional ac) (cond ((null w) ac) ((atom w) (cons w ac)) ((flatten (car w) (flatten (cdr w) ac))))) (defun twins (w) (cond ((null w) nil) ((member (car w) (cdr w)) t) ((twins (cdr w))))) > (deep-twins '(1 2 (3 (4 5) 6 1) 7)) T > (deep-twins '(1 2 (3 (4 5) 6) 7)) NIL
Объяснение кода листинга программы
В коде представлено три функции: deep-twins
, flatten
и twins
.
deep-twins
— это функция, которая принимает один аргументw
. Она вызывает функциюtwins
, передавая ей результат вызова функцииflatten
с аргументомw
.flatten
— это рекурсивная функция, которая принимает два аргумента:w
иac
. Еслиw
равноnil
, то она возвращаетac
. Еслиw
является атомом, то она добавляет его в начало спискаac
и возвращает новый список. Еслиw
является списком, то она вызывает себя рекурсивно дляcar w
иcdr w
, добавляя результат вac
и возвращает новый список.twins
— это функция, которая принимает один аргументw
. Она проверяет, является лиw
равнымnil
. Если это так, то она возвращаетnil
. Еслиw
не являетсяnil
, то она проверяет, содержит лиcdr w
элементcar w
. Если это так, то она возвращаетt
, иначе она вызывает себя рекурсивно дляcdr w
. Поэтому, если мы применимdeep-twins
к списку'(1 2 (3 (4 5) 6) 7)
, то функцияdeep-twins
вызоветtwins
с аргументомflatten '(1 2 (3 (4 5) 6) 7)
. Функцияflatten
вызовет себя рекурсивно дляcar w
, который является списком'(3 (4 5) 6)
, иcdr w
, который является списком'(1 2 7)
. После рекурсивного вызова функцииflatten
, она вернет новый список'(3 4 5 6 1 2 7)
. Функцияtwins
проверит, содержит лиcdr w
элементcar w
. В данном случае,cdr w
содержит элементcar w
, поэтому она вернетt
. Таким образом, если мы применимdeep-twins
к списку'(1 2 (3 (4 5) 6) 7)
, то мы получимt
.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д