Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
List N列表中最大的元素_List_Prolog_Repeat - Fatal编程技术网

List N列表中最大的元素

List N列表中最大的元素,list,prolog,repeat,List,Prolog,Repeat,我需要得到列表中N个最大的元素 我有一个谓词最大的: largest([X], X). largest([X|T], K) :- largest(T, Y), K is max(X,Y). 现在我需要一个新的谓词n_max,它的工作原理如下: ?- n_largest([1, 2, 12, 33, 4, 15, 6], 2, List). 预期结果:列表:[33,15] 我对这个谓词做了一个简单的例子: n_largest(List, 1, [X]) :- largest(Lis

我需要得到列表中N个最大的元素

我有一个谓词最大的

largest([X], X).
largest([X|T], K) :-
   largest(T, Y),
   K is max(X,Y).
现在我需要一个新的谓词n_max,它的工作原理如下:

?- n_largest([1, 2, 12, 33, 4, 15, 6], 2, List).
预期结果:列表:[33,15]

我对这个谓词做了一个简单的例子:

n_largest(List, 1, [X]) :- largest(List, X).

但我不知道如何重复N次最大的并组成预期列表。

以下是基于从输入列表中选择较高值的答案:

n_largest(_, 0, []).
n_largest(L, N, [M|Ms]) :-
    N > 0,
    select(M, L, L1), \+ (member(X, L1), X > M),
    N1 is N - 1,
    n_largest(L1, N1, Ms).

当然,关键是join
select(M,L,L1),\+(member(X,L1),X>M)
产生了双重结果:当前列表L的最大值M,以及移除了M的列表。

以下是基于从输入列表中选择较高值的答案:

n_largest(_, 0, []).
n_largest(L, N, [M|Ms]) :-
    N > 0,
    select(M, L, L1), \+ (member(X, L1), X > M),
    N1 is N - 1,
    n_largest(L1, N1, Ms).

当然,关键是join
select(M,L,L1),\+(member(X,L1),X>M)
产生了双重结果:当前列表L的最大值M,以及移除M的列表。

这里是另一种方法:

n_largest(L, N, R) :-
    msort(L, LS),
    length(R, N),
    append(_, R, LS).
这将计算重复项。因此:

| ?- n_largest([1,4,2,6,3,4,6], 3, L).

L = [4,6,6]

yes
如果要选择唯一的元素,则可以使用
排序

n_largest(L, N, R) :-
    sort(L, LS),
    length(R, N),
    append(_, R, LS).

| ?- n_largest([1,4,2,6,3,4,6], 3, L).

L = [3,4,6]

yes

请注意,这些谓词以递增的顺序提供解决方案,而不一定以它们在原始列表中出现的顺序提供。然而,这并不是一项要求。

这里有另一种方法:

n_largest(L, N, R) :-
    msort(L, LS),
    length(R, N),
    append(_, R, LS).
这将计算重复项。因此:

| ?- n_largest([1,4,2,6,3,4,6], 3, L).

L = [4,6,6]

yes
如果要选择唯一的元素,则可以使用
排序

n_largest(L, N, R) :-
    sort(L, LS),
    length(R, N),
    append(_, R, LS).

| ?- n_largest([1,4,2,6,3,4,6], 3, L).

L = [3,4,6]

yes

请注意,这些谓词以递增的顺序提供解决方案,而不一定以它们在原始列表中出现的顺序提供。但是,这并不是一个要求。

请参见。您希望
n_最大([1,4,1],3,R])的结果是什么?
是一个好问题,我认为它还应该计算重复项。正如你在回答中所做的:)看。你希望n_最大([1,4,1],3,R)的结果是什么?是一个好问题,我认为它还应该计算重复的。正如您在回答中所做的:)