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