Деревья. Преобразование дерева в список. Вывод списка в списке. Найти среднее арифметическое всех элементов - 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
Листинг программы
  1. domains
  2. int=integer
  3. intl=int*
  4. intll=intl*
  5. tree = bt(int, tree, tree); no
  6. treel=tree*
  7.  
  8. predicates
  9. append(intl,intl,intl)
  10. tree2list(tree,intl)
  11. trees2lists(treel,intll)
  12. unite(intll,intl)
  13. len(intl,int)
  14. sum(intl,int)
  15. task(treel)
  16.  
  17. clauses
  18.  
  19. append([],X,X).
  20. append([H|T],X,[H|Y]) :- append(T,X,Y).
  21.  
  22. tree2list(no,[]).
  23. tree2list(bt(N,L,R),X) :- tree2list(L,LL), tree2list(R,RR), append(LL,[N],L1), append(L1,RR,X).
  24.  
  25. trees2lists([],[]).
  26. trees2lists([H|T],[HH|R]):- tree2list(H,HH), trees2lists(T,R).
  27.  
  28. unite([],[]).
  29. unite([H|T],Z) :- unite(T,R), append(H,R,Z).
  30.  
  31. len([],0).
  32. len([_|T],L) :- len(T,L1), L=L1+1.
  33.  
  34. sum([],0).
  35. sum([H|T],S) :- sum(T,S1), S=S1+H.
  36.  
  37. 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

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы