Связать базу данных (потомок, родители) с глобальной переменной - Lisp

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

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

Связать базу данных (потомок, родители) с глобальной переменной FAMILY:
(setf family ’((colin nil nil) (deirdre nil nil) (arthur nil nil) (kate nil nil) (frank
nil nil) (linda nil nil) (suzanne colin deirdre) (bruce arthur kate) (charles
arthur kate) (david arthur kate) (ellen arthur kate) (george frank linda) (hillary
frank linda) (andre nil nil) (tamara bruce suzanne) (vincent bruce suzanne)
(wanda nil nil) (ivan george ellen) (julie george ellen) (marie george ellen)
(nigel andre hillary) (frederick nil tamara) (zelda vincent wanda) (joshua ivan
wanda) (quentin nil nil) (robert quentin julie) (olivia nigel marie) (peter nigel
marie) (erica nil nil) (yvette robert zelda) (diane peter erica)))
Определить функцию GRANDPARENTS, которая возвращает спи- сок прародителей для любого представителя генеалогического де- рева.

Решение задачи: «Связать базу данных (потомок, родители) с глобальной переменной»

textual
Листинг программы
(defun parents (person family)
  (cond ((null family) nil)
        ((eq person (caar family)) (if (equal '(nil nil) (cdar family)) nil (cdar family))) 
        (t (parents person (cdr family)))))
 
==> parents
 
(defun grand-parents (person family)
  (let ((par (parents person family)))
       (append (parents (car par) family) (parents (cadr par) family))))
  
==> grand-parents
 
(grand-parents 'joshua family)
 
==> (george ellen)
 
(grand-parents 'julie family)
 
==> (frank linda arthur kate)

Объяснение кода листинга программы

В коде представлена функция parents, которая принимает два аргумента: person и family. Список family представляет собой базу данных, состоящую из пар человек-родитель. Первая пара человек-родитель соответствует корневому узлу, вторая — узлу первого уровня и так далее. Функция рекурсивно обходит список family и для каждой пары человек-родитель проверяет, является ли человек (пара) родителем person. Если да, то функция возвращает пару родитель-человек. Если нет, то функция продолжает обход списка. В конце функция возвращает nil. В коде также представлена функция grand-parents, которая использует функцию parents для получения списка grandparents человека. Функция рекурсивно обходит список family и для каждой пары человек-родитель проверяет, является ли человек (пара) родителем person. Если да, то функция добавляет пару родитель-человек в список grandparents и продолжает обход списка. В конце функция возвращает список grandparents. При вызове функции grand-parents' с аргументомfamilyи значениемjoshuaв переменнойpersonбудет возвращен список(george ellen). Это связано с тем, что в спискеfamilyесть параgeorge ellen, гдеgeorgeявляется родителемjoshua. При вызове функцииgrand-parents' с аргументом family и значением julie в переменной person будет возвращен список (frank linda arthur kate). Это связано с тем, что в списке family есть пара frank linda, где frank является родителем julie, а также пара arthur kate, где arthur является родителем julie.

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


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

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

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