Входит ли список 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.