我正在使用 Scala 创建一个程序,但是循环可以执行多少次迭代却碰壁了。在 Scala 中进行函数式编程和编程时,我仍然很陌生,但这就是我目前所拥有的:
val s = Range(1, 999999999).view.foldLeft(0)(_ + _ / whatever);
但是我不能让循环说比 999999999 大几个数量级,比如 long 的最大值。我知道我可以使用 for 循环,但我看不到折叠选项。
任何人都知道如何实现这一目标?
谢谢。
我正在使用 Scala 创建一个程序,但是循环可以执行多少次迭代却碰壁了。在 Scala 中进行函数式编程和编程时,我仍然很陌生,但这就是我目前所拥有的:
val s = Range(1, 999999999).view.foldLeft(0)(_ + _ / whatever);
但是我不能让循环说比 999999999 大几个数量级,比如 long 的最大值。我知道我可以使用 for 循环,但我看不到折叠选项。
任何人都知道如何实现这一目标?
谢谢。
(BigInt(1) to BigInt(999999999)).view.foldLeft(BigInt(0))(_ + _ / whatever)
或类似的东西
BigInt("89893798138989379873")
如果你带了足够的时间。
例如:
scala> (BigInt(0) to BigInt("2000000000000000") by BigInt("2000000000")).view.foldLeft(BigInt(0))(_ + _)
res: scala.math.BigInt = 1000001000000000000000
正如您所发现的,Seqs 不能包含超过 Int.MaxValue 元素。在修复此功能之前,请勿使用 Seq。你可以
1)使用while循环
2)使用没有序列的for循环
但是通过这些方式,您不能像foldLeft
示例中那样使用 Scala 集合的方法。
所以你需要的是一个Iterator
. 例如
def bigIterator(start: BigInt, end: BigInt, step: BigInt = 1) =
Iterator.iterate(start)(_ + step).takeWhile(_ <= end)
然后
bigIterator(0, BigInt("3000000000")).foldLeft(BigInt(0))(_ + _)
等会工作。注意:如果您不需要全部范围的BigInt
,请改用它,Long
因为它的速度要快得多。