Я пытаюсь выяснить местный максимум в списке. В основном я должен найти значения, которые больше, чем элемент перед списком и элементом после него, и результат должен быть списком всех локальных максимальных значений.пролог: локальный максимум в списке
Пример: поэтому запрос local_maximum([3,2,3,4,5,2,7,3,6,5], Answer)
должен ответить Answer=[5,7,6]
(с 5>4 , 5>2... 7>2, 7>3
и так далее ..)
Моя логика вы продолжаете делать рекурсивные вызовы, пока не достигнете только 3 элементов в списке. Вы проверяете, является ли средний элемент больше, чем левый и правый, и если вы добавите его в список.
Кроме того, мое намерение заключается в том, чтобы я возвращался к дереву рекурсивных вызовов, я всегда хочу проверить, больше ли второй элемент в дереве рекурсивных вызовов, чем тот, который находится слева и справа от него.
1,3,5,2,1
|
3,5,2,1
|
5,2,1
BASE CASE
checks if 2 is greater than 5, and 1.... append nothing...
|
3,5,2,1
checks if 5 is greater than 3 and 2, append 5...
так далее ..
/*base case stop if it reaches 3 elements*/
local_maximum([X,Y,Z], Answer):- Y>X, Y>Z, Answer is Y.
local_maximum([X,Y,Z], []):- Y<X, Y<Z.
local_maximum([H|T], Answer):-
local_maximum(T, Answer), append([], Answer, Answer).
Я не знаю, как идти о на этом ... простите за мой английский. приветствий,
Решено.
Вы можете проверить при посещении списка, и сохранить только элементы, которые припадки:
local_maximum([X,Y,Z|Xs], [Y|Ms]) :-
Y>X, Y>Z,
local_maximum([Z|Xs], Ms).
затем добавить пропуск и правила базового сценария. То, как вы пишете случай пропуска, будет влиять на правило выше, требуя, чтобы здесь был разрез. Это потому, что Prolog будет искать альтернативы по запросу! Я думаю, что добавленный снимок улучшает читаемость «программы».
Я рад, что вы решили свою проблему. Но, сказав это, вы уничтожили свой вопрос. Я собираюсь вернуть ваши изменения, чтобы они могли помочь другим. –