返回计算总和的值
Returning values which compute sum
这是计算斐波那契数列的 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 个数字,return 这个和?
我可以像这样引入一个 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
}
然后以某种方式检查这个总和值。但这不是一个好的解决方案。
更新:我试图提供求和值和计算此总和的 return 值,而不是实际流的总和。
所以takeSum(7)
会return'0,1,1,2,3'
假设 n 值和将包含 fib 序列的一个子集
您可以在 Stream
上使用 sum
方法。它适用于所有具有隐式 Numeric[T]
实现的类型(例如 Int
、Long
、Double
、BigInt
等)。
fibs.take(5).sum
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 序列子集的总和是无效的,它不会终止!如果这很重要,您可以将其更改为 >=
听起来你想要的是……
fibs.takeWhile(f => fibs.takeWhile(_ <= f).sum <= n)
...其中 n
是目标总和。
不是一个非常有效的实施,但我认为它完成了工作。
或者,也可以。
fibs.take( fibs.tail.scan(0:BigInt)(_+_).indexWhere(_>n) )
更冗长但重复更少。
这是计算斐波那契数列的 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 个数字,return 这个和?
我可以像这样引入一个 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
}
然后以某种方式检查这个总和值。但这不是一个好的解决方案。
更新:我试图提供求和值和计算此总和的 return 值,而不是实际流的总和。
所以takeSum(7)
会return'0,1,1,2,3'
假设 n 值和将包含 fib 序列的一个子集
您可以在 Stream
上使用 sum
方法。它适用于所有具有隐式 Numeric[T]
实现的类型(例如 Int
、Long
、Double
、BigInt
等)。
fibs.take(5).sum
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 序列子集的总和是无效的,它不会终止!如果这很重要,您可以将其更改为 >=
听起来你想要的是……
fibs.takeWhile(f => fibs.takeWhile(_ <= f).sum <= n)
...其中 n
是目标总和。
不是一个非常有效的实施,但我认为它完成了工作。
或者,也可以。
fibs.take( fibs.tail.scan(0:BigInt)(_+_).indexWhere(_>n) )
更冗长但重复更少。