Для каждого бинарного дерева найти среднее арифметическое положительных вершин - 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 выводится в консоль.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д