2013-12-12 3 views
1

목록이 있으며 목록의 각 요소에는 5 개의 구성 요소가 있으므로 목록은 [[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

코드는 첫 번째 매개 변수를 목록의 목록으로 취급하지 않으며 5 개의 요소 목록으로 처리합니다. 여기

는이 문제를 해결할 수있는 방법입니다 :

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