Найти среднее геометрическое положительных вершин дерева - 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. Вот список описаний переменных и действий, которые происходят в коде:

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

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

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