2013-12-12 89 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).