我想要找出列表中的局部最大值。基本上我要找到的值大於列表之前的元素和其後的元素,結果應該是所有局部最大值的列表。prolog:列表中的局部最大值
例子: 所以查詢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會根據請求搜索替代方案!我認爲增加的剪輯提高了'程序'的可讀性。
我很高興你解決了你的問題。但是在這麼說的時候,你已經消除了你的問題。我將恢復你的改變,以便它可以幫助別人。 – 2013-02-18 01:48:10