Для каждого бинарного дерева найти среднее арифметическое положительных вершин - 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 определены некоторые понятия и отношения для работы с бинарными деревьями и вычисления среднего арифметического положительных вершин.
- domains определяют типы данных для переменных:
- int=integer (целое число)
- intl=int* (линейный массив целых чисел)
- bt=bt(int, bt, bt) (бинарное дерево, где каждый узел содержит целочисленное значение и два поддерева)
- 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. (задача для вычисления среднего арифметического положительных вершин двух бинарных деревьев)
- Значение переменной R выводится в консоль.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д