【问题标题】:N Largest elements of the listN 列表的最大元素
【发布时间】:2023-03-15 16:32:01
【问题描述】:

我需要获取列表中最大的 N 个元素。

我有谓词最大

largest([X], X).
largest([X|T], K) :-
   largest(T, Y),
   K is max(X,Y).

现在我需要新的谓词 n_largest,它的工作原理如下:

?- n_largest([1, 2, 12, 33, 4, 15, 6], 2, List).

预期结果:列表:[33, 15]。

我已经做了这个谓词的小例子:

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

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

【问题讨论】:

  • 您希望n_largest([1,4,1], 3, R). 的结果是什么?
  • @lurker 这是一个好问题,我认为它也应该计算重复项。就像你在回答中所做的那样:)

标签: list prolog repeat


【解决方案1】:

这是另一种方法:

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

如果你想选择独特的元素,那么你可以使用sort

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

请注意,这些谓词按升序提供解决方案,不一定按它们在原始列表中出现的顺序。然而,这并没有作为一项要求来说明。

【讨论】:

    【解决方案2】:

    这是基于从输入列表中选择更高值的答案:

    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).
    

    关键当然是连接select(M, L, L1), \+ (member(X, L1), X > M) 会产生双重结果:当前列表 L 的最大 M,以及已删除 M 的列表。

    【讨论】:

      猜你喜欢
      • 2019-08-31
      • 2016-05-24
      • 2011-05-12
      • 1970-01-01
      • 1970-01-01
      • 2013-09-28
      • 1970-01-01
      • 1970-01-01
      • 2022-01-18
      相关资源
      最近更新 更多