0

我是斯卡拉的新手。最近我试图写一些数学函数,但我不明白我做错了什么。

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))

您能否为上述代码提供修复并简要解释我做错了什么?

4

2 回答 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

如果从每个元素中减去平均值,总和将始终为零(或接近零)。你的意图是什么?

于 2018-11-30T22:16:33.150 回答
-1

谢谢大家的回答。我通过更改为解决了这个问题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 造成的。

于 2018-12-01T17:06:38.980 回答