Ответ в теме: Минимальное из положительных и максимальное из отрицательных чисел списка

      Комментарии к записи Ответ в теме: Минимальное из положительных и максимальное из отрицательных чисел списка отключены

Главная Форумы Программирование Помощь с решением задач на Prolog Задачи на списки Минимальное из положительных и максимальное из отрицательных чисел списка Ответ в теме: Минимальное из положительных и максимальное из отрицательных чисел списка

#1747

% L, FlMin, FlMax, BufMin, BufMax, Min, Max
 
% если список кончился и оба буфера инициализированы
% то можно вернуть результат
max_min([], 1, 1, Min, Max, Min, Max):-!.
 
% если список кончился, а буфер не инициализирован
% то решения нет (нет отрицаильных или положительных элементов)
max_min([], _, _, Min, Max, Min, Max):-!.
 
% если буфер минимального элемента не инициализирован
% и элемент больше нуля - инициализируем буфер
max_min([H|T], 0, FlMax, _, BufMax, Min, Max):-
  H > 0, !, max_min(T, 1, FlMax, H, BufMax, Min, Max).
 
% если буфер максимального элемента не инициализирован
% и элемент меньше нуля - инициализируем буфер
max_min([H|T], FlMin, 0, BufMin, _, Min, Max):-
  H < 0, !, max_min(T, FlMin, 1, BufMin, H, Min, Max).
 
% если буфер минимального элемента инициализирован
% и элемент больше нуля - сравниваем и обновляем буфер
max_min([H|T], 1, FlMax, BufMin, BufMax, Min, Max):-
  H > 0, !, (H < BufMin, !, NewBuf = H; NewBuf = BufMin), 
  max_min(T, 1, FlMax, NewBuf, BufMax, Min, Max).
 
% если буфер максимального элемента инициализирован
% и элемент меньше нуля - сравниваем и обновляем буфер
max_min([H|T], FlMin, 1, BufMin, BufMax, Min, Max):-
  H < 0, !, (H > BufMax, !, NewBuf = H; NewBuf = BufMax), 
  max_min(T, FlMin, 1, BufMin, NewBuf, Min, Max).

Если бы вы указали диалект — можно было бы придумать более красивое решение. Тут используются флажки (второй и третий аргументы), отражающие наличие значение в буфере.

Использовать так:

?- max_min([3,-1,-3,5,-7,2,3], 0, 0, _, _, Min, Max).
Min = 2,
Max = -1.