2013-12-12 61 views
1

我有一个列表,列表中的每个元素都有五个组件,所以列表将类似[[1,3,4,5,6],[2,4,5,15, 16],...]。 我想找到列表中所有元素的第三个组件的最大值。我正在使用以下例程,但它不起作用:列表中的最大值

maxList([_,_,_,_,_],Max). 
maxList([_,_,A,_,_|F],Max):- A>=Max, Max1=A, maxList(F,Max1). 
maxList([_,_,A,_,_|F],Max):- A<Max, Max1=Max, maxList(F,Max1). 

任何人都可以帮忙吗? 非常感谢。

回答

3

您的代码不会将第一个参数视为列表列表 - 而是将其视为五个元素的列表。

这里是你如何解决这个问题:

maxList([[_,_,Max,_,_]], Max). /* List of one element */ 
maxList([[_,_,A,_,_]|F], Max):- maxList(F, B), Max is max(A, B). 

该解决方案使用内置max/2

Demo on ideone

+0

非常感谢您的帮助。这正是我需要的。 – user3038679

1

您可以尝试

maxList(L,Max) :- 
    select([_,_,Max,_,_], L, L1), \+ (member([_,_,M,_,_], L1), M > Max). 

CapelliC给出先前的线程解决方案的模板。

1

这是一个改进版本(不会创建任何选择点,递归是终端)。为此,它使用带累加器的辅助谓词。注意:只有列表中的3个第一个元素是“匹配的”。

maxList([[_,_,X|_]|L], Max) :- 
    maxList(L, X, Max). 

maxList([], Max, Max). 
maxList([[_,_,X|_]|L], Max, Max2):- 
    Max1 is max(X, Max), 
    maxList(L, Max1, Max2).