Scala 的左右折叠形象记忆
左折叠(/:)
代码展示
@annotation.tailrec
def foldLeft[A, B](xs: List[A], z: B)(f: (B, A) => B): B =
xs match {
case Nil => z
case h :: t => foldLeft(t, f(z, h))(f)
}
// 形象化表示
op(op(op(z, a), b), c)
形象化展示
右折叠(:\)
代码展示
def foldRight[A, B](ax: List[A], z: B)(f: (A, B) => B): B =
ax match {
case Nil => z
case h :: t => f(h, foldRight(t, z)(f))
}
// 形象化表示
op(a, op(b, op(c, z)))
形象化展示
用 foldRight 实现 foldLeft
def foldLeft[A, B](xs: List[A], z: B)(f: (B, A) => B): B =
foldRight(xs, z)((x: A, y: B) => f(y, x))
用 foldLeft 实现 foldRight
// 尾递归的方式实现,不管列表多大,都不会有栈溢出
def foldRight[A, B](xs: List[A], z: B)(f: (A, B) => B): B =
foldLeft(xs, z)((x: B, y: A) => f(y, x))