簡體   English   中英

列表中的最大出現次數

[英]Max Occurrences in a List

我正在嘗試編寫一個Prolog函數,該函數給定一個列表返回該列表中重復次數最多的元素,例如:

['a','a','b','c','b']應該返回['a','b'] ['c','a','a','c',' b','c','b']應該返回['c']等...

我正在嘗試使用另一個函數(該函數計算列表(計數列表)中某事物的存在次數,但是我什么也沒得到。請提供一些幫助嗎?

listMax(In, Out) :-
    listMax(In, Out, 0).

listMax([H | L], [H | O], Max) :-
    countlist(H, [H | L], N),   
    N > Max,
    listMax(L, [H | O], N).

listMax([H | L], O, Max) :-
    countlist(H, [H | L], N),
    <=(Max, N),
    listMax(L, O, Max).

listMax([], [], _Max).

listMax([], _O, _Max).

這個怎么樣:

listmax(L, M):-
 listmax(L, [], [], M).

listmax([], Seen, MMax, Max):-
  MMax=[] -> Max=Seen ; listmax(MMax, [], [], Max).
listmax([H|T], Seen, MMax, Max):-
  (member(H, Seen) ->
    listmax(T, Seen, [H|MMax], Max) ;
    listmax(T, [H|Seen], MMax, Max)).

這里對此算法作一些解釋:

想法是遍歷列表,刪除每個項目的第一次出現,從而產生一個新列表。 然后,將相同的算法遞歸地應用於此新列表,直到得到一個空列表。 至此,我們知道先前的列表是我們要查找的列表。

listmax / 4的第二個子句是迭代子句,該子句檢查這是否是第一次看到該項目。 可見項的列表保留在該謂詞的第二個參數中。 第三個參數收集剩余的項(第一次不可見的項)。

listmax / 4的第一子句是基本情況。 當我們遍歷列表時,它就起作用了。 此時,它會檢查剩余項目列表是否為空,在這種情況下,我們知道“搜索列表”就是我們要尋找的列表。 否則,我們將再次應用該算法,但使用“剩余列表”作為輸入列表。


listmax(In,Out) :-
        setof(A,member(A,In),L1),
        findall([Count,A],(
                    member(A,L1),
                    count(A,In,Count)),
               L2),
        max_1(L2,Max),
        findall(A,member([Max,A],L2),Out).

count(A,[],0).
count(A,[A|R],X) :-
        count(A,R,Y),
        X is Y + 1.
count(A,[_|R],X) :-
        count(A,R,X).

max_1(L,Max) :-
        findall(A,member([A|_],L),L1),
        max(L1,Max).

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM