TraversableOnce使用mutable foldLeft
实现var result
。
def foldLeft[B](z: B)(op: (B, A) => B): B = {
var result = z
this foreach (x => result = op(result, x))
result
}
我理解递归实现foldLeft
是不切实际的。现在我想知道是否有可能在没有可变变量的情况下有效地实现foldLeft
。
可以吗?为什么不能呢?
答案 0 :(得分:7)
尾递归是你的朋友:
def foldLeft[A, B](xs: Seq[A], z: B)(op: (B, A) => B): B = {
def f(xs: Seq[A], acc: B): B = xs match {
case Seq() => acc
case x +: xs => f(xs, op(acc, x))
}
f(xs, z)
}
顺便说一下,TraversableOnce
没有实现head
或tail
,访问元素的唯一方法是使用foreach
。
答案 1 :(得分:0)
def foldLeft[B](z: B)(op: (B, A) => B): B = {
val thislist = this.toList
@tailrec
def myFold(result: B, list: List[A]): B = list match {
case Nil => result
case head :: tail => myFold(op(result,head), tail)
}
myFold(z, thislist)
}