如何编写两个子句递归定义来查找列表中的最大值。到目前为止,我写了这个:
max(L,M):-
max([H|T],M):-
max(T,H,M).
max([],M,M).
max([H|T],Y,M):-
H =< Y,
max(T,Y,M).
max([H|T],Y,M):-
H > Y,
max(T,H,M).
这不起作用,它说有一个我无法看到的语法错误,我知道它也不是两个子句。任何人都知道如何简化它以使其成为两个条款?
答案 0 :(得分:10)
正如您所说,我使用谓词的'max'名称。此实现不依赖于任何内置谓词:
max([X],X).
max([X|Xs],X):- max(Xs,Y), X >=Y.
max([X|Xs],N):- max(Xs,N), N > X.
答案 1 :(得分:5)
语法错误是因为前两个子句没有正文。
要回答您的问题,请注意可以按以下方式定义列表的最大值:
因此,
max_list([H], H).
max_list([H|T], M2) :-
max_list(T, M),
M2 is max(H, M).
此代码使用max/2
(SWI-Prolog,GNU-Prolog)。请注意,大多数或所有Prolog实现都将具有内置函数max_list/2
(S,G),因此实际上不需要自己定义它。
编辑: Bakore notes尾部递归实现可能更有效。你可以通过定义一个带有附加参数max_list/3
的谓词C
来做到这一点,即到目前为止看到的最大值。
max_list([H|T], M) :- max_list(T, H, M).
max_list([], C, C).
max_list([H|T], C, M) :- C2 is max(C, H), max_list(T, C2, M).
答案 2 :(得分:1)
以下是列表列表中最大值的解决方案
max_list([], C, C).
max_list([H|T], C, M) :- C2 is max(C, H), max_list(T, C2, M).
max_list([], []).
max_list([[H|HB]|B],[RH|RB]) :- max_list(HB, H, RH), max_list(B, RB).
ex: max_list([[1,3,6], [6,3,8,2],[2,1,0]]).
答案 3 :(得分:1)
结构域
num=INTEGER
list = num*
PREDICATES
nondeterm maxList(list,num)
条款
maxList([A],A).
maxList([A|List],Max):- Max=A,maxList(List,Max1),A>=Max1.
maxList([A|List],Max):- Max=Max1,
maxList(List,Max1),A< Max1.
目标
maxList([1,2,3,5,4],Max).
答案 4 :(得分:1)
这个肯定有用
l:-listing.
m(L,X):-aku2(L,0,X).
aku2([],B,B).
aku2([G|O],Maks,C):-maks(Maks,G,Maks1),aku2(O,Maks1,C).
maks(A,B,C):-A>B, C is A.
maks(A,B,C):-A=<B, C is B.
答案 5 :(得分:0)
我认为下面的代码可以解决问题:
max_list([],0).
max_list([H],H).
max_list([H|T],M):- max_list(T,M1),M is max(H,M1).
答案 6 :(得分:0)
我知道这个问题很老,但这是使用if-then-else结构的答案:
maxmember([X],X).
maxmember([H|T],Max) :- maxmember(T, M),(H>M -> Max is H ; Max is M).
答案 7 :(得分:-2)
list([H],H).
list([H1,H2|T],X):-H1>H2,list([H1|T],X).
list([_|T],X):-list(T,X).
目标:list([3,9,4,5],M)
输出:M=9