1

我试图找出列表中的局部最大值。基本上我要找到大于列表之前的元素和列表之后的元素的值,结果应该是所有局部最大值的列表。

示例:所以一个查询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 个元素。您检查中间元素是否大于左右元素,如果是,则将其添加到列表中。

另外,我的意图是当我上递归调用树时,我总是想检查递归调用树中的第二个元素是否大于它的左右一个元素。
IE

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 会根据要求搜索替代方案!我认为添加的剪辑提高了“程序”的可读性。

4

2 回答 2

2

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

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

然后添加跳过和基本案例规则。您编写跳过案例的方式将影响上面的规则,需要在此处放置一个剪切。这是因为 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].
于 2013-02-16T07:04:56.667 回答
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|_]
于 2015-02-22T03:22:09.493 回答