Ответ в теме: Определить максимальное количество подряд идущих положительных чисел

      Комментарии к записи Ответ в теме: Определить максимальное количество подряд идущих положительных чисел отключены

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

#1959

Задача была бы гораздо проще, если бы была готовая функция, считающая количество положительных элементов в начале списка, значит надо написать такую функцию:

count_positive_start([], 0):-!.
count_positive_start([Head|_Tail], 0):-
  Head =< 0, !.
count_positive_start([_Head|Tail], Count):-
  count_positive_start(Tail, TailCount),
  Count is TailCount + 1.

В пустом списке нет положительных элементов, функция возвращает ноль. Аналогичный результат получается в случае, если первый элемент не является положительным. Иначе первый элемент отбрасывается, а остальные — обрабатываются рекурсивно, к полученному результату добавляется единица (соответствующая первому положительному элементу).

Функция, вычисляющая наибольшее количество положительных элементов, идущих подряд должна вызвать count_positive_start с каждой позиции исходного списка и выбрать среди результатов максимальный, при этом понадобится функция, вычисляющая наибольшее из двух чисел:

max(A, B, A):-
  A > B, !.
max(_, B, B).

Такая функция может быть встроена в некоторые диалекты Пролога, но может выглядеть иначе — например в SWI Prolog она описана как оператор, а в Turbo Prolog и вовсе отсутствует.

max_count_positive([], 0):-!.
max_count_positive([Head|Tail], Count):-
  count_positive_start([Head|Tail], ListCount),
  max_count_positive(Tail, TailCount),
  max(ListCount, TailCount, Count).

Если список не пуст, то функция:

  1. считает количество положительных элементов в начале списка (ListCount);
  2. рекурсивно обрабатывает элементы хвоста (части списка кроме первого элемента), подсчитывая наибольшее количество идущих подряд положительных элементов в нем (TailCount);
  3. выбирает из двух результатов наибольший.