prolog:列表中的本地最大值

时间:2013-02-16 03:25:07

标签: 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).

然后添加skip和基本案例规则。您编写跳过案例的方式将影响上述规则,需要在此处进行剪切。这是因为Prolog会根据要求搜索替代品!我认为增加的削减可以提高“程序”的可读性。

2 个答案:

答案 0 :(得分:2)

您可以在访问列表时进行检查,并保存适合的元素:

local_maximum([X,Y,Z|Xs], [Y|Ms]) :-
  Y>X, Y>Z,
  local_maximum([Z|Xs], Ms).

然后添加skip和基本案例规则。您编写跳过案例的方式将影响上述规则,需要在此处进行剪切。这是因为Prolog 将根据要求搜索替代品!我认为增加的削减可以提高“程序”的可读性。

我测试了版本的剪切:

?- local_maximum([3,2,3,4,5,2,7,3,6,5], Answer).
Answer = [5, 7, 6].

?- local_maximum([1,2,1,2,1], Answer).
Answer = [2, 2].

答案 1 :(得分:0)

我不知道以前的解决方案,但在自己尝试这个问题后,我就能解决这个问题。

local_maximum([X,Y,Z], [Y|Ms]):-
  nonvar(X), nonvar(Y), nonvar(Z),
  Y>X, Y>Z, !.

local_maximum([X,Y,Z|Xs], [Y|Ms]):-
  nonvar(X), nonvar(Y), nonvar(Z),
  Y>X, Y>Z,
  local_maximum([X,Z|Xs], Ms).

local_maximum([X,Y,Z|Xs], Ms):-
  nonvar(X), nonvar(Y), nonvar(Z),
  local_maximum([X,Z|Xs], Ms), !.

通过测试,你会得到。

| ?- local_maximum([3,2,3,4,5,2,7,3,6,5], Y).
Y = [5,7,6|_]