使用Scala函数风格的移位Schwefel函数实现
移位Schwefel函数的数学形式描述如下 我已经使用循环在scala中实现了这个函数。这是我的密码使用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 ,
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确切地说,是我的旧代码,它不能产生正确的答案。当您显示函数的数学定义时,我更新了我的代码。这一个生成与您的代码完全相同的输出。