Подсписки с повторяющимися элементами - 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.

  1. deep-twins — это функция, которая принимает один аргумент w. Она вызывает функцию twins, передавая ей результат вызова функции flatten с аргументом w.
  2. flatten — это рекурсивная функция, которая принимает два аргумента: w и ac. Если w равно nil, то она возвращает ac. Если w является атомом, то она добавляет его в начало списка ac и возвращает новый список. Если w является списком, то она вызывает себя рекурсивно для car w и cdr w, добавляя результат в ac и возвращает новый список.
  3. 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.

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


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

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

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