2017-04-11 1 views
1

평소 약간의 일탈 평균 프롤로그 찾기에 요소의 평균을 찾기, 그러나 나는 다음과 같은 코드가 있습니다프롤로그 - 목록

% courseAvg 
    courseAvg([], 0). 
    courseAvg([_+_+Mark|Tail], Avg) :- 
     courseAvg(Tail, Number), 
     Temp is Number + Mark, 
     Avg is div(Temp,2). 

이 그러나 정확한 평균을 산출하지 않습니다. 당신은 거의 맞아

답변

1

는, 문제는 귀하의 목록에있는 하나 개의 요소가있는 경우는 0을 반환 courseAvg([], 0)를 호출하고 그냥 Mark을 반환해야하면서 2Mark+0을 분할한다는 것입니다.

추가는 IF 조건 :

courseAvg([], 0). 
courseAvg([_+_+Mark|Tail], Avg) :- 
     courseAvg(Tail, Number), 
     (Number =\= 0 -> 
      Temp is Number + Mark, 
      Avg is div(Temp,2); 
      Avg is Mark). 

(또는 당신은 기본 케이스로 하나 개의 요소 반환 표시가있는 목록을 가질 수있다). 예 : div/2를 사용하기 때문에 그것은 단지 정수를 반환 위의 당신이 볼 수 있듯이

?- courseAvg([9,9,9],N). 
N = 9. 

?- courseAvg([9,9,8],N). 
N = 8. 

. 당신이 원하는 경우 평균 지점 교체 떠있는 : div(Temp,2)/(Temp,2)로 : 계산가 정의 될 수 있기 때문에

?- courseAvg([9,9,8],N). 
N = 8.75. 

?- courseAvg([9,8,8],N). 
N = 8.5. 

?- courseAvg([9,7,8],N). 
N = 8.25. 
+0

정말 고마워요, 당신의 대답은 훌륭하게 작동했습니다. 즉, 내 데이터 구조 (즉, courseAvg ([_ + _ Mark | Tail], Avg)에 맞게 일부 와일드 카드를 사용했지만 전체 로직에는 영향을 미치지 않습니다. –

+1

도움이 되서 기쁘다!, 네, 구조체를 발견하고 테스트를 위해 제거했습니다. 코드에 다시 추가 할 것입니다 ... – coder

1

빈 목록은 정말 평균이없는 0 있기 때문에 (이것은, 0/0 것 집단). 이것은 하나의 평균의 계산 착오를 피할 수

courseAvg([_+_+Mark], Mark). 
courseAvg([_+_+Mark, Next|Tail], Avg) :- 
    courseAvg([Next|Tail], Number), 
    Temp is Number + Mark, 
    Avg is Temp/2. 

: 나는 적어도 2 개 요소와 재귀 경우 계약을 기본 경우 평균이 가장 작은 목록을하는 하나의 요소가 될 수 있도록, 그리고 할 것 현재 구현이 수행하는 요소.