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

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

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

В этой теме 1 ответ, 2 участника, последнее обновление  Васильев Владимир Сергеевич 2 года/лет, 7 мес. назад.

  • Автор
    Сообщения
  • #1746

    questioner
    Участник

    Никак не могу разобраться с задачей. Есть список из отрицательных и положительных целых чисел. Нужно выбрать минимальное из положительных и максимальное из отрицательных, но организовать это с накопителями.
    С минимумом поступила следующим образом, но не понимаю, как сюда прикрутить еще и максимум из отрицательных.

    min_l(H1,H2,H1):-
    H1=H2.
    min_list([H],H).
    min_list([H1,H2|Tail],Min):-
    min_list([H2|Tail],Mintail),
    min_l(H1,Mintail,Min).

    Очень надеюсь на Вашу помощь.

  • #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.

Для ответа в этой теме необходимо авторизоваться.