Входит ли список b в список a - Lisp
Формулировка задачи:
Здравствуйте, вечные проблемы с рекурсией, никак не могу ее понять. Помогите, пожалуйста
Реализовать функцию, которая выдает T, в случае если заданный объект obj1 является элементом заданного списка. Например, для объекта obj1=b и списка ’((2) (3) 4 5 b (e r) g) результатом будет T
Решение задачи: «Входит ли список b в список a»
textual
Листинг программы
(defun is-in (lst obj) (cond ((member obj lst) t) (t (let ((u (mapcar (lambda (x) (is-in x obj)) (remove-if 'atom lst)))) (if u (apply 'or u) nil))))) (is-in '((2) (3) 4 5 b (e r) g) 'b) ==> T (is-in '((2) (3) 4 5 b (e r) g) 'bb) ==> NIL (is-in '((2) (3) 4 5 ((bb)) (e r) g) 'bb) ==> T
Объяснение кода листинга программы
В данном коде определённая функция is-in
проверяет, содержится ли элемент obj
в списке lst
. Функция использует оператор cond
для проверки двух условий:
- Если элемент
obj
уже содержится в спискеlst
(синтаксисmember obj lst
), то функция возвращаетt
(истину). - В противном случае функция применяет оператор
mapcar
к спискуlst
, который проходит по каждому элементу списка и применяет к нему функциюis-in obj
. Полученный результат сохраняется в переменнойu
. Затем с помощью оператораif
проверяется значение переменнойu
. Если оно не равноnil
, значит, хотя бы один элемент списка содержитobj
, и функция возвращаетt
. В противном случае функция возвращаетnil
. В приведенном примере кода вызывается функцияis-in
с двумя аргументами:lst
— список((2) (3) 4 5 b (e r) g)
иobj
— символb
. Функция возвращаетt
, так как символb
содержится в списке. Во втором примере кода вызывается функцияis-in
с тем же спискомlst
и другим аргументомobj
— символомbb
. Функция возвращаетnil
, так как символbb
не содержится в списке. В третьем примере кода вызывается функцияis-in
с тем же спискомlst
и другим аргументомobj
— списком((bb))
. Функция возвращаетt
, так как список((bb))
содержится в спискеlst
.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д