Написать функцию для списка с произвольной иерархией, которая определяет принадлежность атома X строке L - Lisp

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

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

Помогите, пожалуйста, написать функцию для списка с произвольной иерархией, которая определяет принадлежность атома X строке L

Решение задачи: «Написать функцию для списка с произвольной иерархией, которая определяет принадлежность атома X строке L»

textual
Листинг программы
(defun inside (e w)
  (cond ((null w) nil)
        ((equal (car w) e))
        ((listp (car w)) (or (inside e (car w)) (inside e (cdr w))))
        ((inside e (cdr w)))))
 
> (inside 'a '(q (a w) e r))
T
> (inside 'a '(q (w) e r))
NIL
 
(defun inside (e w &aux (a (car w)) (d (cdr w)))
  (cond ((null w) nil)
        ((equal a e))
        ((listp a) (or (inside e a) (inside e d)))
        ((inside e d))))
 
> (inside 'a '(q (a w) e r))
T
> (inside 'a '(q (w) e r))
NIL
 
(defun inside (e w)
  (when w (cond ((equal a e))
                ((listp a) (or (inside e a) (inside e d)))
                ((inside e d)))))
 
> (inside 'a '(q (a w) e r))
T
> (inside 'a '(q (w) e r))
NIL
 
(defun inside (e w)
  (loop for a in w thereis
        (or (equal a e)
            (when (listp a) (inside e a)))))
 
> (inside 'a '(q (a w) e r))
T
> (inside 'a '(q (w) e r))
NIL

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

Функция inside, которая принимает два аргумента, e и w, и возвращает T, если элемент e находится внутри элемента списка w, и NIL в противном случае. Список w может содержать произвольную иерархию, и функция должна рекурсивно вызываться для каждого подэлемента списка. Код сначала использует структуру cond для проверки типа списка w. Если w — это NIL, функция возвращает NIL. Если w — это атом, функция проверяет, равен ли он e. Если w — это список, функция рекурсивно вызывает себя для первого элемента списка (car w) и, если это не сработает, для остальной части списка (cdr w). Второй код использует переменные a и d для хранения первого и остального элементов списка w. Функция снова использует структуру cond для проверки типа списка. Если w — это NIL, функция возвращает NIL. Если a равно e, функция возвращает T. Если a — это список, функция рекурсивно вызывает себя для элемента e и списка a. Если это не сработает, функция рекурсивно вызывает себя для элемента e и списка d. Если w — это атом, функция возвращает NIL. Третий код использует цикл loop для итерации по каждому элементу списка w. Функция снова проверяет, равен ли элемент e. Если это не сработает, функция рекурсивно вызывает себя для элемента e и списка a. Все четыре куска кода дают одинаковый результат для входных данных 'a '(q (a w) e r), где функция inside возвращает T, а для входных данных 'a '(q (w) e r) функция inside возвращает NIL, что указывает на то, что элемент 'a' не находится в списке.

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

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