Деревья. Преобразование дерева в список. Вывод списка в списке. Найти среднее арифметическое всех элементов - 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 реализуется задача, связанная с преобразованием дерева в список и вычислением среднего арифметического всех элементов. Список функций и предикатов, используемых в коде:

  1. append(intl,intl,intl) - функция, которая объединяет два списка в один.
  2. tree2list(tree,intl) - предикат, который преобразует дерево в список.
  3. trees2lists(treel,intll) - предикат, который преобразует список деревьев в список списков.
  4. unite(intll,intl) - функция, которая объединяет два списка в один.
  5. len(intl,int) - предикат, который вычисляет длину списка.
  6. sum(intl,int) - предикат, который вычисляет сумму всех элементов списка.
  7. task(treel) - предикат, который выполняет задачу (преобразование дерева в список, вычисление среднего арифметического и вывод результата). Описание работы кода:
  8. Создается список пустых значений для хранения результатов: R.
  9. Рекурсивно вызывается предикат tree2list для преобразования дерева в список. В результате список R будет содержать все элементы дерева.
  10. С помощью функции unite список R объединяется в один список: U.
  11. С помощью предиката sum вычисляется сумма всех элементов списка U.
  12. С помощью предиката len вычисляется длина списка U.
  13. Вычисляется среднее арифметическое путем деления суммы на длину списка (S div L).
  14. Результат (среднее арифметическое) выводится на экран с помощью функции write. Таким образом, данный код выполняет преобразование дерева в список, вычисляет сумму всех элементов списка, вычисляет длину списка, а затем находит среднее арифметическое и выводит его на экран.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

12   голосов , оценка 4.417 из 5
Похожие ответы