Определить функцию, которая ищет заданную вершину в дереве - Lisp
Формулировка задачи:
Помогите, пожалуйста, с заданием!
Определить функцию, которая ищет заданную вершину в дереве и возвращает список, содержащий предка искомой вершины и её потомков: (предок (потомок1 потомок2...))
Решение задачи: «Определить функцию, которая ищет заданную вершину в дереве»
textual
Листинг программы
(defun task (root what &optional (from nil)) (cond ((null root) nil) ((= (cadr root) what) (cons (cadr from) (list (remove what(tree2list root))))) (t (append (task (car root) what root) (task (caddr root) what root))))) ==> TASK (task '(((nil 111 nil) 23 (nil 8 nil)) 11 (nil -4 (nil 7 nil))) -4) ==> (11 (7)) (task '(((nil 111 nil) 23 (nil 8 nil)) 11 (nil -4 (nil 7 nil))) 23) ==> (11 (111 8))
Объяснение кода листинга программы
В коде определена функция task
, которая принимает три аргумента: root
(корневой элемент дерева), what
(элемент, который нужно найти в дереве) и необязательный аргумент from
(используется для возврата коллекции узлов, содержащих искомый элемент).
Функция использует конструкцию cond
для проверки трех условий:
- Если
root
равенnil
, то возвращаетсяnil
. - Если
cadr root
равенwhat
, то возвращается новая коллекция, содержащаяwhat
и все поддеревья, которые не содержатwhat
. - Если условие не выполнено, то рекурсивно вызывается функция
task
для двух новых поддеревьев, которые получаются путем разделенияroot
на две части поwhat
. В примере кода вызывается функцияtask
с аргументами:(((nil 111 nil) 23 (nil 8 nil)) 11 (nil -4 (nil 7 nil))) -4
иnil
. Первая строка(11 (7))
в выводе означает, что функция нашла элемент-4
в дереве, и возвращает новый список, содержащий только узлы, которые содержат-4
. Вторая строка(11 (111 8))
означает, что функция нашла элемент23
в дереве, и возвращает новый список, содержащий только узлы, которые содержат23
.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д