首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >返回计算总和的值

问返回计算总和的值
EN

Stack Overflow用户
提问于 2016-09-09 17:24:33
回答 3查看 103关注 0票数 0

下面是一个计算斐波那契数列的Scala流:

代码语言:javascript
复制
    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:

代码语言:javascript
复制
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值sum将包含fib序列的子集。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2016-09-09 18:27:00

听起来你想要的东西大概是...

代码语言:javascript
复制
fibs.takeWhile(f => fibs.takeWhile(_ <= f).sum <= n)

...where n是目标总和。

这不是一个非常高效的实现,但我认为它可以完成这项工作。

或者,或者。

代码语言:javascript
复制
fibs.take( fibs.tail.scan(0:BigInt)(_+_).indexWhere(_>n) )

有点冗长,但少了一点重复的工作。

票数 0
EN

Stack Overflow用户

发布于 2016-09-09 17:29:20

您可以在Stream上使用sum-method。它将适用于所有具有隐式Numeric[T]实现的类型(如Int、Long、Double、BigInt等)。

代码语言:javascript
复制
fibs.take(5).sum
票数 4
EN

Stack Overflow用户

发布于 2016-09-09 18:25:44

代码语言:javascript
复制
def takeSum(n:Int) = fib.scanLeft(List[BigInt]()){(b,a)=> a::b}
                        .find(_.sum==n)
                        .get
                        .reverse
 takeSum(7)  //> res0: List[BigInt] = List(0, 1, 1, 2, 3)

scanLeft构建流的前缀(前缀按相反的顺序),然后只需找到具有正确和的前缀。如果您的假设是n值将是fib序列的子集的和是无效的,那么它将不会终止!如果这很重要,您可以将其更改为>=

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39408187

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档