【发布时间】:2016-09-09 09:24:32
【问题描述】:
这是一个计算斐波那契数列的 Scala 流:
import scala.math.BigInt
object fib extends App {
val fibs: Stream[BigInt] = BigInt(0) #:: BigInt(1) #:: fibs.zip(
fibs.tail).map(n => {
n._1 + n._2
})
}
fibs take 5 foreach println
fibs take 6 foreach println
源代码:http://www.scala-lang.org/api/current/index.html#scala.collection.immutable.Stream
如何使用流对前n个数字求和,而不是取序列中的前n个数字,然后返回这个总和?
我可以像这样介绍一个 var sum:
object fib extends App {
var sum = 3;
val fibs: Stream[BigInt] = BigInt(0) #:: BigInt(1) #:: fibs.zip(fibs.tail).map(n => {
sum = n._1.toInt + n._2.toInt
n._1 + n._2
})
fibs take 5 foreach println
}
然后以某种方式检查这个总和值。但这不是一个好的解决方案。
更新:我正在尝试提供计算该总和的总和值和返回值,而不是实际流的总和。
所以takeSum(7) 将返回'0,1,1,2,3'
假设n值总和将包含fib序列的子集
【问题讨论】:
-
我最喜欢的 fib 流:
def fib: Stream[BigInt] = 0 #:: fib.scan(1:BigInt)(_+_) -
如果传递给 takeSum 的参数的值不是 fib 流的某些前缀的总和(例如 8),会发生什么?
-
@TheArchetypalPaul 假设 n 值总和将包含 fib 序列的子集
-
那么你的问题是“如何返回总和为指定值的流的前缀”?
-
@The Archetypal Paul 是的,感谢您的澄清