Реализация смещенной функции Швефеля с использованием функционального стиля Scala - PullRequest
0 голосов
/ 11 марта 2020

Математическая форма смещенной функции Швефеля описывается следующим образом.

enter image description here

Я реализовал эту функцию в 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
}

Как я могу переписать этот код, используя функциональную мощность Scala оптимизированным способом?

1 Ответ

2 голосов
/ 11 марта 2020

Если я правильно понимаю вашу проблему.
Это должно сделать то, что вы хотите:

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

Или вы можете просто использовать функции более высокого порядка, чтобы express этот алгоритм был более кратким.

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
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...