В списке целых чисел определить максимально длинную последовательность чисел - Prolog

Узнай цену своей работы

Формулировка задачи:

Помогите, пожалуйста написать программу на SWI-Prolog реализующую обработку списка. С прологом проблемы.

Задача:

В списке целых чисел A1, A2, ..., An определить максимально длинную последовательность чисел, расположенных в убывающем порядке.

Т.е, при запросе для списка [1,2,8,7,6,5], программа должна вывести 4 и [8,7,6,5]. Заранее благодарен.

Решение задачи: «В списке целых чисел определить максимально длинную последовательность чисел»

textual
Листинг программы
  1. max_len_desc(Xs, M, Ys) :-
  2.     max_len_desc(Xs, 0, M, [], Ys).
  3.  
  4. max_len_desc([], M, M, Ys, Ys).
  5. max_len_desc(Xs, M0, M, Ys0, Ys) :-
  6.     len_desc(Xs, M1, Ys1, Zs),
  7.     ( M1 > M0, M2 = M1, Ys2 = Ys1 ; M2 = M0, Ys2 = Ys0 ),
  8.     !,
  9.     max_len_desc(Zs, M2, M, Ys2, Ys).
  10.  
  11. len_desc([X | Xs], N, Ys, Zs) :-
  12.     len_desc(X, Xs, 1, N, Ys, Zs).
  13.  
  14. len_desc(X, [], N, N, [X], []).
  15. len_desc(X, [H | T], N, N, [X], [H | T]) :-
  16.     X =< H,
  17.     !.
  18. len_desc(X, [H | T], N0, N, [X | R], Zs) :-
  19.     X > H,
  20.     N1 is N0 + 1,
  21.     len_desc(H, T, N1, N, R, Zs).

Объяснение кода листинга программы

В коде определена логическая функция max_len_desc/5, которая вычисляет максимально длинную последовательность чисел в списке целых чисел Xs. Список Xs перебирается с помощью рекурсии до тех пор, пока не будет достигнуто базовое условие: либо список пуст, либо список содержит только один элемент. В этом случае функция завершается и возвращает текущую длину максимальной последовательности M и список Ys, содержащий эту последовательность. В случае, если список Xs не пуст, то для каждого его элемента X вызывается вспомогательная функция len_desc/6, которая подсчитывает длину последовательности, заканчивающейся на X. Если X больше или равен предыдущему элементу, то текущая длина последовательности увеличивается на единицу. Если X меньше предыдущего элемента, то рекурсивно вызывается len_desc для оставшейся части списка, и текущая длина последовательности устанавливается равной N0 + 1. Кроме того, в коде определена вспомогательная функция len_desc/6, которая подсчитывает длину последовательности, заканчивающейся на определенном элементе X. Если X меньше или равен предыдущему элементу, то текущая длина последовательности увеличивается на единицу. Если X больше предыдущего элемента, то рекурсивно вызывается len_desc для оставшейся части списка, и текущая длина последовательности устанавливается равной N0 + 1. В итоге, после выполнения всех рекурсивных вызовов, функция max_len_desc возвращает максимально длинную последовательность чисел в списке Xs.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

15   голосов , оценка 4.333 из 5

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

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

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