Для каждого бинарного дерева найти среднее арифметическое положительных вершин - 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
Листинг программы
  1. domains
  2. int=integer
  3. intl=int*
  4. bt=bt(int, bt, bt); no
  5. btl=bt*
  6. reall=real*
  7.  
  8. predicates
  9. app(intl,intl,intl)
  10. tree2list(bt,intl)
  11. avg_pos(intl,int,int,real)
  12. list_avg(btl,reall)
  13.  
  14.  
  15. clauses
  16.  
  17. app([],X,X).
  18. app([H|T],X,[H|R]) :- app(T,X,R).
  19.  
  20. tree2list(no,[]).
  21. tree2list(bt(V,L,R),U) :- tree2list(L,LL), tree2list(R,RR), app(LL,[V],LLV), app(LLV,RR,U).
  22.  
  23. avg_pos([],S,N,R) :- R=S/N.
  24. avg_pos([H|T],S,N,R) :- H>0, S1=S+H, N1=N+1, avg_pos(T,S1,N1,R).
  25. avg_pos([H|T],S,N,R) :- H<=0, avg_pos(T,S,N,R).
  26.  
  27. list_avg([],[]).
  28. list_avg([B|T],[U|R]) :- tree2list(B,BL), avg_pos(BL,0,0,U), list_avg(T,R).
  29.  
  30. goal
  31. 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

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы