如何使用高阶函数计算scala中的std
How to calculate the std in scala with high order functions
我是 Scala 新手。
最近我试着写一些数学函数,但我不明白我做错了什么。
import scala.annotation.tailrec
import scala.math.{pow, sqrt}
object HikeStatProcessor {
def mean(list: List[Double]): Double = {
sum(list, value => value) / list.size
}
def std(list: List[Double]): Double = {
val means: Double = mean(list)
sqrt(pow(sum(list, (head: Double) => head - means), 2) / list.size)
}
private def sum(list: List[Double],
operation: Double => Double): Double = {
@tailrec
def innerCalc(xs: List[Double], accu: Double): Double = {
if (xs.isEmpty) return accu
println(accu + operation(xs.head))
innerCalc(xs.tail, accu + operation(xs.head))
}
innerCalc(list, 0)
}
}
val a = HikeStatProcessor.std(List(1, 2, 3))
能否请您修复以上代码并简要说明我做错了什么?
考虑以下语句:sum(list, (head: Double) => head - means)
。让我们把它分解成更小的步骤。
sum(list , (head: Double) => head - means)
sum(List(1,2,3), x => x - 2)
sum(List(1-2, 2-2, 3-2))
-1 + 0 + 1 = 0
如果从每个元素中减去平均值,总和将始终为零(或接近于零)。你的意图是什么?
感谢大家的回答。
我通过将 def std
更改为:
解决了这个问题
def std(list: List[Double]): Double = {
val means: Double = mean(list)
sqrt( sum(list, (head: Double) => pow(head - means, 2)) / (list.size - 1) )
}
这个问题是因为我没有在我的匿名函数中计算 pow 2。
我是 Scala 新手。 最近我试着写一些数学函数,但我不明白我做错了什么。
import scala.annotation.tailrec
import scala.math.{pow, sqrt}
object HikeStatProcessor {
def mean(list: List[Double]): Double = {
sum(list, value => value) / list.size
}
def std(list: List[Double]): Double = {
val means: Double = mean(list)
sqrt(pow(sum(list, (head: Double) => head - means), 2) / list.size)
}
private def sum(list: List[Double],
operation: Double => Double): Double = {
@tailrec
def innerCalc(xs: List[Double], accu: Double): Double = {
if (xs.isEmpty) return accu
println(accu + operation(xs.head))
innerCalc(xs.tail, accu + operation(xs.head))
}
innerCalc(list, 0)
}
}
val a = HikeStatProcessor.std(List(1, 2, 3))
能否请您修复以上代码并简要说明我做错了什么?
考虑以下语句:sum(list, (head: Double) => head - means)
。让我们把它分解成更小的步骤。
sum(list , (head: Double) => head - means)
sum(List(1,2,3), x => x - 2)
sum(List(1-2, 2-2, 3-2))
-1 + 0 + 1 = 0
如果从每个元素中减去平均值,总和将始终为零(或接近于零)。你的意图是什么?
感谢大家的回答。
我通过将 def std
更改为:
def std(list: List[Double]): Double = {
val means: Double = mean(list)
sqrt( sum(list, (head: Double) => pow(head - means, 2)) / (list.size - 1) )
}
这个问题是因为我没有在我的匿名函数中计算 pow 2。