Посетить каждый узел в следующем порядке - Lisp
Формулировка задачи:
Добрый день!помогите пожайлуста с примром на лиспи:
Дано случайное дерево.Надо посетить каждый узел в следующим порядки:
-посещаем прямого потомка 1;
-посещаем прямого потомка 2;
-.........................;
-посещаем прямого потомка n;
Другими словами слева на право,сверху вниз.
Решение задачи: «Посетить каждый узел в следующем порядке»
textual
Листинг программы
(defun travel-tree (tree) (cond ((null tree) nil) (t (cons (car tree) (apply 'append (mapcar #'travel-tree (cdr tree))))))) ==> TRAVEL-TREE (travel-tree '(r (1 (a) (b) (c)) (2 (d) (e) (f)) (3 (g) (h) (i)))) ==> (R 1 A B C 2 D E F 3 G H I)
Объяснение кода листинга программы
В коде определён функционал для обхода каждого узла дерева в определённом порядке, представленного в виде списка. Вот список описывающих пошагово действия, которые происходят в коде:
- В функции
travel-treeопределён условный операторcond, который проверяет, является ли переданный аргументtreeравнымnil. - Если
treeравноnil, то возвращаетсяnil. - Если
treeне равноnil, то возвращается конкатенация двух значений: первого элементаtreeи результата рекурсивного вызова функцииtravel-treeдля остатка спискаtree. - В начале функции
travel-treeпередаётся дерево в виде списка:(r (1 (a) (b) (c)) (2 (d) (e) (f)) (3 (g) (h) (i)). - После вызова функции
travel-treeс аргументомtree, будет выполнен рекурсивный вызов для каждого элемента списка. - Для каждого элемента списка будет выполнен следующий набор действий:
- Первый элемент списка будет добавлен в начало результата.
- Результат рекурсивного вызова функции
travel-treeдля оставшейся части списка будет присоединен к началу результата. - Результатом работы функции
travel-treeдля исходного списка будет(R 1 A B C 2 D E F 3 G H I).