2017-04-11 8 views
1

リストに通常の平均的なプロローグに-見つけるから少し逸脱する要素の平均を見つけることが、私は次のコードを持っている:プロローグ -

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

しかしこれは正しい平均が得られません。

答えて

1

あなたは、ほぼ正しいです、問題はあなたのリストには一つの要素を持っているとき、それは0を返し、それだけでMarkを返す必要がありながら、それは2Mark+0を分割courseAvg([], 0)を呼び出すことです。条件ならば

追加:

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. 

。あなたはAVGが浮動小数点になりたい場合は、交換してください:/(Temp,2)div(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つの要素を再帰ケースの契約を聞かせ現在の実装が行う要素です。