Определить рекурсивную функцию 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
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д