List N列表中最大的元素
我需要得到列表中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
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)的结果是什么?是一个好问题,我认为它还应该计算重复的。正如您在回答中所做的:)