scala 集合的阶乘

利用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函数会把中间的计算结果放入新的集合中并传递给下一次函数的调用。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值