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

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

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

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

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

textual
Листинг программы
  1. (defun all-desc (person base &optional (res nil)) ;; список всех предков
  2.  (let* ((pa (car (remove-if-not #'(lambda (x) (eq (car x) person)) base)))
  3.         (f  (cadr pa))
  4.         (m  (caddr pa)))
  5.        (if (and (null f) (null m))
  6.            res
  7.            (all-desc f base (all-desc m base  (cons f (cons m res)))))))
  8.  
  9. ==> all-desc
  10.  
  11. (defun descended-from (child parent base)
  12.   (member parent (all-desc child base)))
  13.  
  14. ==> descended-from
  15.  
  16. (descended-from 'zelda 'kate family)
  17.  
  18. ==> T
  19.  
  20. (descended-from 'TAMARA 'ARTHUR family)
  21.  
  22. ==> T
  23.  
  24. (descended-from 'TAMARA 'Linda family)
  25.  
  26. ==> 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

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы