Определить рекурсивную функцию DESCENDED-FROM, которая возвращает true - Lisp
Формулировка задачи:
Решение задачи: «Определить рекурсивную функцию DESCENDED-FROM, которая возвращает true»
(defun all-desc (person base &optional (res nil)) ;; список всех предков (let* ((pa (car (remove-if-not #'(lambda (x) (eq (car x) person)) base))) (f (cadr pa)) (m (caddr pa))) (if (and (null f) (null m)) res (all-desc f base (all-desc m base (cons f (cons m res))))))) ==> all-desc (defun descended-from (child parent base) (member parent (all-desc child base))) ==> descended-from (descended-from 'zelda 'kate family) ==> T (descended-from 'TAMARA 'ARTHUR family) ==> T (descended-from 'TAMARA 'Linda family) ==> NIL
Объяснение кода листинга программы
В коде определены две функции: ALL-DESC и DESCENDED-FROM. Функция ALL-DESC принимает три аргумента: PERSON, BASE и RES. — PERSON — человек, предков которого нужно найти. — BASE — список предков, в котором нужно искать. — RES — результат поиска, список найденных предков. Функция рекурсивно перебирает список BASE и ищет в нём элементы, которые являются предками PERSON. Если такой элемент найден, то его родители (если они есть) помещаются в RES и вызывается рекурсия функции для каждого из них. Если предков не найдено, то RES остаётся пустым. Функция DESCENDED-FROM принимает три аргумента: CHILD, PARENT и BASE. — CHILD — человек, предков которого нужно проверить. — PARENT — предок, наличие которого нужно проверить. — BASE — список предков, в котором нужно искать. Функция находит все предки CHILD в списке BASE и проверяет наличие в этом списке PARENT. Если PARENT найден, то возвращается T, иначе NIL. Пример использования: (descended-from 'zelda 'kate family) => T (descended-from 'TAMARA 'ARTHUR family) => T (descended-from 'TAMARA 'Linda family) => NIL
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д