Для каждого бинарного дерева найти среднее арифметическое положительных вершин - Prolog

Узнай цену своей работы

Формулировка задачи:

Дано число и список, элементы которого — непустые бинарные деревья с числами в качестве вершин. Для каждого такого дерева найти среднее арифметическое положительных вершин. Из полученных результатов сформировать список и вывести его. Затем через пробел вывести количество элементов в нём, не считая равных указанному числу. Например: если дано "6 [bt(–5,bt(9,no,no),bt(3,bt(–7,no,no),no)),bt(3,bt(–5,no,no),bt(2,no,no))]", ответом будет "[6,3.5] 1".

Решение задачи: «Для каждого бинарного дерева найти среднее арифметическое положительных вершин»

textual
Листинг программы
domains
int=integer
intl=int*
bt=bt(int, bt, bt); no
btl=bt*
reall=real*
 
predicates
app(intl,intl,intl)
tree2list(bt,intl)
avg_pos(intl,int,int,real)
list_avg(btl,reall)
 
 
clauses
 
app([],X,X).
app([H|T],X,[H|R]) :- app(T,X,R).
 
tree2list(no,[]).
tree2list(bt(V,L,R),U) :- tree2list(L,LL), tree2list(R,RR), app(LL,[V],LLV), app(LLV,RR,U).
 
avg_pos([],S,N,R) :- R=S/N.
avg_pos([H|T],S,N,R) :- H>0, S1=S+H, N1=N+1, avg_pos(T,S1,N1,R).
avg_pos([H|T],S,N,R) :- H<=0, avg_pos(T,S,N,R).
 
list_avg([],[]).
list_avg([B|T],[U|R]) :- tree2list(B,BL), avg_pos(BL,0,0,U), list_avg(T,R).
 
goal
list_avg([bt(–5,bt(9,no,no),bt(3,bt(–7,no,no),no)),bt(3,bt(–5,no,no),bt(2,no,no))],R), write(R),nl.

Объяснение кода листинга программы

В этом коде на языке Prolog определены некоторые понятия и отношения для работы с бинарными деревьями и вычисления среднего арифметического положительных вершин.

  1. domains определяют типы данных для переменных:
    • int=integer (целое число)
    • intl=int* (линейный массив целых чисел)
    • bt=bt(int, bt, bt) (бинарное дерево, где каждый узел содержит целочисленное значение и два поддерева)
    • btl=bt* (линейный массив бинарных деревьев)
    • reall=real* (линейный массив вещественных чисел)
  2. predicates определяют функции и отношения:
    • app(intl,intl,intl) (рекурсивная функция для обхода дерева)
    • tree2list(bt,intl) (преобразование бинарного дерева в список)
    • avg_pos(intl,int,int,real) (вычисление среднего арифметического положительных вершин)
    • list_avg(btl,reall) (вычисление среднего арифметического списка бинарных деревьев)
  3. clauses определяют правила для функций и отношений:
    • app([],X,X). (базовый случай для пустого списка)
    • app([H|T],X,[H|R]) :- app(T,X,R). (рекурсивный случай для списка с одним элементом)
    • tree2list(no,[]). (базовый случай для пустого списка)
    • tree2list(bt(V,L,R),U) :- tree2list(L,LL), tree2list(R,RR), app(LL,[V],LLV), app(LLV,RR,U). (рекурсивный случай для бинарного дерева с одним элементом)
    • avg_pos([],S,N,R) :- R=S/N. (базовый случай для пустого списка)
    • avg_pos([H|T],S,N,R) :- H>0, S1=S+H, N1=N+1, avg_pos(T,S1,N1,R). (рекурсивный случай для списка с одним элементом)
    • avg_pos([H|T],S,N,R) :- H<=0, avg_pos(T,S,N,R). (базовый случай для списка с отрицательными или нулевыми значениями)
    • list_avg([],[]). (базовый случай для пустого списка)
    • list_avg([B|T],[U|R]) :- tree2list(B,BL), avg_pos(BL,0,0,U), list_avg(T,R). (рекурсивный случай для списка с одним элементом)
  4. goal определяет задачу для вычисления среднего арифметического положительных вершин двух бинарных деревьев:
    • list_avg([bt(–5,bt(9,no,no),bt(3,bt(–7,no,no),no)),bt(3,bt(–5,no,no),bt(2,no,no))],R), write(R),nl. (задача для вычисления среднего арифметического положительных вершин двух бинарных деревьев)
  5. Значение переменной R выводится в консоль.

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


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

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

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