Если вы хотите использовать reduce
, вам нужно уменьшить как x
, так и y
за один проход, как это
def centroid(points: IndexedSeq[Point]): Point = {
val p = points.reduce( (s, p) => Point(s.x + p.x, s.y + p.y) )
val len = points.length
Point(p.x/len, p.y/len)
}
Если вы хотите вычислить x
и y
независимо, тогда используйте foldLeft
вместо reduce
, как это
def centroid(points: IndexedSeq[Point]): Point = {
val x = points.foldLeft(0.0)(_ + _.x)
val y = points.foldLeft(0.0)(_ + _.y)
val len = points.length
Point(x/len, y/len)
}
Возможно, это яснее, но обрабатывает points
дважды, поэтому он может быть несколько менее эффективным.