使用Scala函数风格的移位Schwefel函数实现

使用Scala函数风格的移位Schwefel函数实现,scala,functional-programming,Scala,Functional Programming,移位Schwefel函数的数学形式描述如下 我已经使用循环在scala中实现了这个函数。这是我的密码 def ShiftedSchwefel ( li : List[Double] ) : Double = { var res = 0.0 for (i <- li.indices ) { var temp = 0.0 for (j <- 0 to i) { temp += li(i) } res += pow ( temp ,

移位Schwefel函数的数学形式描述如下

我已经使用循环在scala中实现了这个函数。这是我的密码

def ShiftedSchwefel (   li  : List[Double]  ) : Double  =  {
 var res = 0.0
 for (i <- li.indices ) {
  var temp = 0.0
  for (j <- 0 to i) {
    temp += li(i)
  }
  res += pow    (  temp   ,   2  )
 }
 res
}
def-ShiftedSchwefel(li:List[Double]):Double={
var res=0.0

如果我正确理解了你的问题,我将 这应该满足您的要求:

def ShiftedSchwefelRecursive[N : Numeric](data: List[N]): N = {
  import Numeric.Implicits._

  val zero = Numeric[N].zero
  val one = Numeric[N].one

  @annotation.tailrec
  def loop(remaining: List[N], acc: N, idx: N): N =
    remaining match {
      case n :: tail =>
        val sum = n * idx
        loop(
          remaining = tail,
          acc + (sum * sum),
          idx + one
        )

      case Nil =>
        acc
    }

  loop(remaining = data, acc = zero, idx = one)
}
或者,您可以使用高阶函数更简洁地表示此算法

def ShiftedSchwefelHOF[N : Numeric](data: List[N]): N = {
  import Numeric.Implicits._

  data
    .iterator
    .zipWithIndex
    .map {
      case (n, idx) =>
        n * Numeric[N].fromInt(idx + 1)
    }.map { x =>
      x * x
    }.sum
}

如果我正确理解您的问题。
这应该满足您的要求:

def ShiftedSchwefelRecursive[N : Numeric](data: List[N]): N = {
  import Numeric.Implicits._

  val zero = Numeric[N].zero
  val one = Numeric[N].one

  @annotation.tailrec
  def loop(remaining: List[N], acc: N, idx: N): N =
    remaining match {
      case n :: tail =>
        val sum = n * idx
        loop(
          remaining = tail,
          acc + (sum * sum),
          idx + one
        )

      case Nil =>
        acc
    }

  loop(remaining = data, acc = zero, idx = one)
}
或者,您可以使用高阶函数更简洁地表示此算法

def ShiftedSchwefelHOF[N : Numeric](data: List[N]): N = {
  import Numeric.Implicits._

  data
    .iterator
    .zipWithIndex
    .map {
      case (n, idx) =>
        n * Numeric[N].fromInt(idx + 1)
    }.map { x =>
      x * x
    }.sum
}

@LuisMiguelMejíaSuárez I更新了问题并添加了数学的移位Schwefel函数。@LuisMiguelMejíaSuárez I更新了问题并添加了数学的移位Schwefel函数。您的代码版本没有按需工作。我更新了您的递归代码版本,现在它将按需工作。@user12140540您的编辑是ex实际上是我的旧代码,它不能产生正确的答案。当您显示函数的数学定义时,我更新了我的代码。这一个代码产生的输出与您的代码完全相同。您的代码版本没有按需要工作。我更新了您的递归代码版本,现在它将按需要工作。@user12140540您的编辑是e确切地说,是我的旧代码,它不能产生正确的答案。当您显示函数的数学定义时,我更新了我的代码。这一个生成与您的代码完全相同的输出。