利用scala丰富的高阶函数,处理阶乘。
(1)传统方式定义阶乘
首先,我们来看一下传统的阶乘如何定义:
// 传统递归方式
def baseFactories(x:Int):Int = if (x ==0) 1 else (x*baseFactories(x-1))
// test
val t = Traversable(1 to 5:_*)
println(t.map(baseFactories(_)))
// List(1, 2, 6, 24, 120)
(2)scala高阶函数scan 方式
scan 的定义:
def scan[B >: A, That](z: B)(op: (B, B) => B)(implicit cbf: CanBuildFrom[Repr, B, That]): That = scanLeft(z)(op)
def scanLeft[B, That](z: B)(op: (B, A) => B)(implicit bf: CanBuildFrom[Repr, B, That]): That = {
val b = bf(repr)
b.sizeHint(this, 1)
var acc = z
b += acc
for (x <- this) { acc = op(acc, x); b += acc }
b.result
}
使用用例如下:
val t = Traversable(1 to 5:_*)
// 利用scan方式计算
val result =t.scan(1)(_*_)
println(result.tail)
// List(1, 2, 6, 24, 120)
可以看出两种方式的结果是一样的,只是scan函数会把中间的计算结果放入新的集合中并传递给下一次函数的调用。