以下函数计算Scala中两个2D点之间的欧几里德距离:
def euclideanDist(pt1: List[Double], pt2: List[Double]): Double =
sqrt(pow(pt1(0)-pt2(0), 2)+pow(pt1(1)-pt2(1), 2))
我想设计一个周边函数来累积点列表(或ListBuffer)中每个连续点之间的距离。
例如
val arr:ListBuffer[List[Double]] = ListBuffer(List(0, 0), List(0,1), List(1,1), List(1,0), List(0, 0))
perimeter(arr)
应该将输出设为4。
这就是我的尝试:
def perimeter(arr: ListBuffer[List[Double]]): Double =
arr.reduceLeft(euclideanDist)
执行时,编译器抛出此错误
Name: Unknown Error
Message: <console>:43: error: type mismatch;
found : (List[Double], List[Double]) => Double
required: (Any, List[Double]) => Any
arr.reduceLeft(euclideanDist)
^
<console>:43: error: type mismatch;
found : Any
required: Double
arr.reduceLeft(euclideanDist)
^
StackTrace:
我可以强制执行并使用for循环执行整个操作,但是想知道这是否可以用Scala方式更简单地解决。
答案 0 :(得分:2)
这是什么:
val arr:List[List[Double]] = List(List(0, 0), List(0,1), List(1,1), List(1,0), List(0, 0))
arr.sliding(2).map{case List(a,b) => euclideanDist(a,b)}.sum