Найти среднее геометрическое положительных вершин дерева - Prolog
Формулировка задачи:
Найти среднее геометрическое положительных вершин дерева.
Решение задачи: «Найти среднее геометрическое положительных вершин дерева»
textual
Листинг программы
domains
treetype = tree(real, treetype, treetype); empty
predicates
counter_p(treetype,real)
sum_p(treetype,real)
avg_p(treetype,real)
pow(real,real,real)
clauses
pow(X,N,Z):- Z=exp(N*ln(X)).
counter_p(empty,0.0).
counter_p(tree(V,L,R),N) :- V<=0, counter_p(L,LP), counter_p(R,RP), N=LP+RP.
counter_p(tree(V,L,R),N) :- V>0, counter_p(L,LP), counter_p(R,RP), N=LP+RP+1.
sum_p(empty,0.0).
sum_p(tree(V,L,R),N) :- V<=0, sum_p(L,LP), sum_p(R,RP), N=LP+RP.
sum_p(tree(V,L,R),N) :- V>0, sum_p(L,LP), sum_p(R,RP), N=LP+RP+V.
avg_p(T,V) :- counter_p(T,N), sum_p(T,S), N > 0, N1=1/N, pow(S,N1,V).
avg_p(T,0) :- counter_p(T,N), abs(N)<1, write("No positive nodes!"),nl.
goal
avg_p(tree(-6,tree(7,empty,empty),tree(8,empty,tree(-1,empty,empty))),Z),write(Z),nl.
Объяснение кода листинга программы
В этом коде используется язык программирования Prolog. Вот список описаний переменных и действий, которые происходят в коде:
domains: Определяет типы данных для переменных в программе. В данном случае,treetypeявляется типом данных для представления дерева, аreal- для чисел с плавающей точкой.predicates: Определяет функции, которые могут быть проверены на истинность или ложность. В данном случае,counter_p,sum_pиavg_p- это функции, которые подсчитывают количество, сумму и среднее значение положительных узлов дерева соответственно. Функцияpowиспользуется для вычисления числа в степени.clauses: Определяет правила, когда функции истинны или ложны. В данном случае, правила для функцийcounter_pиsum_pоснованы на том, является ли значение узла отрицательным или положительным.pow(X,N,Z):- Z=exp(N*ln(X)).: Это правило определяет, как вычислить число в степени. Здесьexpиln- это встроенные функции, которые вычисляют экспоненту и логарифм соответственно.counter_p(empty,0.0).: Это правило устанавливает начальное значение счетчика для пустого дерева равным 0.counter_p(tree(V,L,R),N) :- V<=0, counter_p(L,LP), counter_p(R,RP), N=LP+RP.: Это правило говорит, что если значение узла отрицательное, то значение счетчика равно сумме значений счетчиков левого и правого поддеревьев.counter_p(tree(V,L,R),N) :- V>0, counter_p(L,LP), counter_p(R,RP), N=LP+RP+1.: Это правило говорит, что если значение узла положительное, то значение счетчика равно сумме значений счетчиков левого и правого поддеревьев, увеличенной на 1.sum_p(empty,0.0).: Это правило устанавливает начальное значение суммы для пустого дерева равным 0.sum_p(tree(V,L,R),N) :- V<=0, sum_p(L,LP), sum_p(R,RP), N=LP+RP.: Это правило говорит, что если значение узла отрицательное, то значение суммы равно сумме значений суммы левого и правого поддеревьев.sum_p(tree(V,L,R),N) :- V>0, sum_p(L,LP), sum_p(R,RP), N=LP+RP+V.: Это правило говорит, что если значение узла положительное, то значение суммы равно сумме значений суммы левого и правого поддеревьев, увеличенной на значение узла.avg_p(T,V) :- counter_p(T,N), sum_p(T,S), N > 0, N1=1/N, pow(S,N1,V).: Это правило вычисляет среднее значение положительных узлов дерева. ЗдесьN1- это значение, обратное кN, и используется для вычисления среднего значения.avg_p(T,0) :- counter_p(T,N), abs(N)<1, write(No positive nodes!),nl.: Это правило обрабатывает случай, когда в дереве нет положительных узлов. В этом случае выводится сообщениеNo positive nodes!и программа завершается.goal: Это цель, которую нужно достичь. В данном случае, цель состоит в том, чтобы вычислить среднее значение положительных узлов дерева, представленного в виде-6 + 7 + 8 - (-1) + (-1). Значение переменнойZбудет содержать результат. Этот код вычисляет среднее геометрическое положительных узлов дерева, представленное в виде-6 + 7 + 8 - (-1) + (-1). Результатом будет значение переменнойZ.