Функция для нахождения среднего арифметического листьевых вершин дерева - Lisp
Формулировка задачи:
Дано S-выражение, представляющее дерево вида «(РебенокЛевый Родитель РебенокПравый)» с числами в качестве вершин. Определить функцию для нахождения среднего арифметического листьевых вершин этого дерева.
Например: если дано "(((nil 1 nil) 5 (nil 7 nil)) 3 (nil 4 (nil 10 nil)))", ответом будет "3".
Решение задачи: «Функция для нахождения среднего арифметического листьевых вершин дерева»
textual
Листинг программы
(defun sum-tree (tree) (cond ((null tree) 0) ((and (null (car tree)) (null (caddr tree))) (cadr tree)) (t (+ (sum-tree (car tree)) (sum-tree (caddr tree)))))) ==> sum-tree (sum-tree '(((nil 1 nil) 5 (nil 7 nil)) 3 (nil 4 (nil 10 nil)))) ==> 18 (defun num-tree (tree) (cond ((null tree) 0) ((and (null (car tree)) (null (caddr tree))) 1) (t (+ (num-tree (car tree)) (num-tree (caddr tree)))))) ==> num-tree (num-tree '(((nil 1 nil) 5 (nil 7 nil)) 3 (nil 4 (nil 10 nil)))) ==> 3 (avg-tree '(((nil 1 nil) 5 (nil 7 nil)) 3 (nil 4 (nil 10 nil)))) ==> 6
Объяснение кода листинга программы
Функция sum-tree принимает в качестве аргумента дерево, и возвращает сумму значений всех вершин дерева.
Функция num-tree принимает в качестве аргумента дерево, и возвращает количество вершин дерева.
Функция avg-tree принимает в качестве аргумента дерево, и возвращает среднее арифметическое значений всех вершин дерева.
В данном примере:
sum-treeвызывает функциюsum-treeс аргументом(((nil 1 nil) 5 (nil 7 nil)) 3 (nil 4 (nil 10 nil)))num-treeвызывает функциюnum-treeс аргументом(((nil 1 nil) 5 (nil 7 nil)) 3 (nil 4 (nil 10 nil)))avg-treeвызывает функциюavg-treeс аргументом(((nil 1 nil) 5 (nil 7 nil)) 3 (nil 4 (nil 10 nil)))Поскольку функцияsum-treeрекурсивно обходит все вершины дерева, она может быть использована для вычисления суммы значений всех вершин. Поскольку функцияnum-treeрекурсивно обходит все вершины дерева, она может быть использована для подсчета количества вершин дерева. Поскольку функцияavg-treeвычисляет среднее арифметическое значений всех вершин дерева, она может быть использована для вычисления среднего значения.