Связать базу данных (потомок, родители) с глобальной переменной - Lisp
Формулировка задачи:
(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)))
Решение задачи: «Связать базу данных (потомок, родители) с глобальной переменной»
(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
.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д