如何使用Scala Fibonacci创建不同类型的数字序列?

时间:2014-07-28 16:36:28

标签: scala

如何根据之前的值创建各种类型的数字序列,例如Scala的Fibonacci Stream example

x4, /2,例如=> 10 40 20 80 40 160

测试

test("numbersequence") {
  assert(Calculation.numbersequence(10, 40, 20, 80) === 160)
}

主要

def numbersequence(a: Int, b: Int, c: Int, d: Int) : Int = {
  lazy val s: Stream[Int] = a #:: s.scanLeft(b)(_+_)
  s(5)
}

是否可以使用相同的方法来创建这样的数字序列,还是应该使用另一种方法?

2 个答案:

答案 0 :(得分:1)

怎么样:

val s: Stream[Int] = {
  def timesFour(v: Int): Stream[Int] = v #:: half(v * 4)
  def half(v: Int): Stream[Int] = v #:: timesFour(v / 2)
  timesFour(a)
}

答案 1 :(得分:0)

我假设您指的是Scala Stream documentation中的Fibonacci示例。

当然,对前一个值的任何简单规则都有效:

val doubles: Stream[Long] = 1l #:: 2 #:: doubles.tail.map (_ * 2)

请注意,此技术至少需要2个起始值,否则.tail将导致无限递归。

如果要创建具有交替规则的流,可以使用flatMap而不是map来创建多个值:

object streams {

  val alternatingRule: Stream[Long] = 1l #:: 4l #:: alternatingRule.tail.flatMap { n => 
    val n1 = n * 4
    val n2 = n1 / 2 
    n1 #:: n2 #:: Stream.Empty 
  }

  def main(args: Array[String]) = {
    println(alternatingRule(5))
    println(alternatingRule.take(10).toList)
  }

}