我想要找出列表中的局部最大值。基本上我要找到的值大于列表之前的元素和其后的元素,结果应该是所有局部最大值的列表。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