Определить рекурсивную функцию DESCENDED-FROM, которая возвращает true - Lisp

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

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

Определить рекурсивную функцию DESCENDED-FROM, которая возвращает true, если первый представитель генеалогического дерева происходит от второго. Например, > (DESCENDED-FROM ‘TAMARA ‘ARTHUR) T > (DESCENDED-FROM ‘TAMARA ‘LINDA) NIL

Решение задачи: «Определить рекурсивную функцию DESCENDED-FROM, которая возвращает true»

textual
Листинг программы
(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

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

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

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