Деревья. Преобразование дерева в список. Вывод списка в списке. Найти среднее арифметическое всех элементов - Prolog
Формулировка задачи:
Дан список, элементы которого — непустые бинарные деревья с числами в качестве вершин. Для каждого такого дерева выполнить преобразование дерева в список (в порядке обхода левый-голова-правый) и вывести результат в виде списка списков. Затем через пробел вывести среднее арифметическое всех элементов.
Например: если дано "[bt(5,no,bt(1,no,no)), bt(3,bt(4,no,no),bt(2,no,no))]", ответом будет "[[5,1],[4,3,2]] 3".
Решение задачи: «Деревья. Преобразование дерева в список. Вывод списка в списке. Найти среднее арифметическое всех элементов»
textual
Листинг программы
domains int=integer intl=int* intll=intl* tree = bt(int, tree, tree); no treel=tree* predicates append(intl,intl,intl) tree2list(tree,intl) trees2lists(treel,intll) unite(intll,intl) len(intl,int) sum(intl,int) task(treel) clauses append([],X,X). append([H|T],X,[H|Y]) :- append(T,X,Y). tree2list(no,[]). tree2list(bt(N,L,R),X) :- tree2list(L,LL), tree2list(R,RR), append(LL,[N],L1), append(L1,RR,X). trees2lists([],[]). trees2lists([H|T],[HH|R]):- tree2list(H,HH), trees2lists(T,R). unite([],[]). unite([H|T],Z) :- unite(T,R), append(H,R,Z). len([],0). len([_|T],L) :- len(T,L1), L=L1+1. sum([],0). sum([H|T],S) :- sum(T,S1), S=S1+H. task(X) :- trees2lists(X,R), write(R), unite(R,U), write(' '), sum(U,S), len(U,L), AVG=S div L, write(AVG), nl.
Объяснение кода листинга программы
В коде на языке Prolog реализуется задача, связанная с преобразованием дерева в список и вычислением среднего арифметического всех элементов. Список функций и предикатов, используемых в коде:
append(intl,intl,intl)
- функция, которая объединяет два списка в один.tree2list(tree,intl)
- предикат, который преобразует дерево в список.trees2lists(treel,intll)
- предикат, который преобразует список деревьев в список списков.unite(intll,intl)
- функция, которая объединяет два списка в один.len(intl,int)
- предикат, который вычисляет длину списка.sum(intl,int)
- предикат, который вычисляет сумму всех элементов списка.task(treel)
- предикат, который выполняет задачу (преобразование дерева в список, вычисление среднего арифметического и вывод результата). Описание работы кода:- Создается список пустых значений для хранения результатов:
R
. - Рекурсивно вызывается предикат
tree2list
для преобразования дерева в список. В результате списокR
будет содержать все элементы дерева. - С помощью функции
unite
списокR
объединяется в один список:U
. - С помощью предиката
sum
вычисляется сумма всех элементов спискаU
. - С помощью предиката
len
вычисляется длина спискаU
. - Вычисляется среднее арифметическое путем деления суммы на длину списка (
S div L
). - Результат (среднее арифметическое) выводится на экран с помощью функции
write
. Таким образом, данный код выполняет преобразование дерева в список, вычисляет сумму всех элементов списка, вычисляет длину списка, а затем находит среднее арифметическое и выводит его на экран.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д