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

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

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

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

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

    questioner
    Участник

    Нужно решить на 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. выбирает из двух результатов наибольший.

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