如何根据之前的值创建各种类型的数字序列,例如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)
}
是否可以使用相同的方法来创建这样的数字序列,还是应该使用另一种方法?
答案 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)
}
}