【问题标题】:Returning values which compute sum返回计算总和的值
【发布时间】: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 是的,感谢您的澄清

标签: scala scala-collections


【解决方案1】:

您可以在Stream 上使用sum-方法。它将适用于所有具有可用隐式Numeric[T] 实现的类型(例如IntLongDoubleBigInt 等)。

fibs.take(5).sum

【讨论】:

  • 我试图提供计算这个总和的总和值和返回值,而不是实际流的总和。我已经更新了问题,对于歧义道歉
【解决方案2】:

听起来你想要一些类似...的东西

fibs.takeWhile(f => fibs.takeWhile(_ <= f).sum <= n)

...n 是目标总和。

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

或者,或者。

fibs.take( fibs.tail.scan(0:BigInt)(_+_).indexWhere(_>n) )

稍微冗长一点,但重复的努力少一点。

【讨论】:

    【解决方案3】:
    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 序列子集的总和无效,则它不会终止!如果这很重要,您可以将其更改为 &gt;=

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-05-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-05-12
      • 2014-10-28
      相关资源
      最近更新 更多