Написать функцию проверяющую является ли аргумент элементом списка - Lisp

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

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

Написать функцию проверяющую является ли аргумент элементом списка. Аргумент может быть как атомом так и списком. Список могут состоять из списков. Например Аргумент: (1 2 (7)) Список (1 2 2 (1 2(7)) 1) И Аргумент: 1 Список (1 2 2 (1 2(7)) 1) Причем есть ограничения на функции которые можно юзать. Это только defun; cons; ca..ar; cd..dr; '; atom; COND ; eq, or, and, not, numberp + те которые я писал раньше но из них реально может пригодится только проверка поэлементной эквивалентности списков
(defun eqlists (lst1 lst2)                         
   (cond ((and (null lst1)(null lst2)) T)          
         ((or (and (null lst1)(not (null lst2)))   
               (and (not (null lst1))(null lst2))  
         (not (equal (car lst1)(car lst2)))) nil)  
         (T  (eqlists (cdr lst1)(cdr lst2)))))

Решение задачи: «Написать функцию проверяющую является ли аргумент элементом списка»

textual
Листинг программы
(defun deep-member (v w)
  (cond ((null w) nil)
        ((equalp (car w) v) t)
        ((atom (car w)) (deep-member v (cdr w)))
        (t (or (deep-member v (car w)) (deep-member v (cdr w))))))
 
> (deep-member '(7) '(1 2 2 (1 2(7)) 1))
T

Объяснение кода листинга программы

В этом коде определена функция deep-member, которая проверяет, является ли элемент v частью списка w. Функция использует структуру cond для проверки нескольких условий:

  1. Если w равно null, то возвращается nil, так как пустой список не содержит элементов.
  2. Если car (первый элемент) w равен v, то возвращается t, так как v является членом списка.
  3. Если atom (является ли он атомом) car w, то возвращается результат вызова deep-member v для остальной части списка (cdr w).
  4. В противном случае, возвращается результат вызова deep-member v для car w или cdr w. Таким образом, функция проходит по каждому элементу списка, пока не будет найден элемент v или пока не будет просмотрена вся структура списка. В приведенном примере, функция deep-member вызывается с аргументами '(7) и '(1 2 2 (1 2(7)) 1). Поскольку '(7) является подсписком '(2 (7)) в '(1 2 2 (1 2(7)) 1), функция возвращает t.

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


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

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

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