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

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

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

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

Задача:

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

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

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

textual
Листинг программы
max_len_desc(Xs, M, Ys) :-
    max_len_desc(Xs, 0, M, [], Ys).
 
max_len_desc([], M, M, Ys, Ys).
max_len_desc(Xs, M0, M, Ys0, Ys) :-
    len_desc(Xs, M1, Ys1, Zs),
    ( M1 > M0, M2 = M1, Ys2 = Ys1 ; M2 = M0, Ys2 = Ys0 ),
    !,
    max_len_desc(Zs, M2, M, Ys2, Ys).
 
len_desc([X | Xs], N, Ys, Zs) :-
    len_desc(X, Xs, 1, N, Ys, Zs).
 
len_desc(X, [], N, N, [X], []).
len_desc(X, [H | T], N, N, [X], [H | T]) :-
    X =< H,
    !.
len_desc(X, [H | T], N0, N, [X | R], Zs) :-
    X > H,
    N1 is N0 + 1,
    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
Похожие ответы