4

我正在使用 Scala 创建一个程序,但是循环可以执行多少次迭代却碰壁了。在 Scala 中进行函数式编程和编程时,我仍然很陌生,但这就是我目前所拥有的:

val s = Range(1, 999999999).view.foldLeft(0)(_ + _ / whatever);

但是我不能让循环说比 999999999 大几个数量级,比如 long 的最大值。我知道我可以使用 for 循环,但我看不到折叠选项。

任何人都知道如何实现这一目标?

谢谢。

4

2 回答 2

6
(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
于 2013-07-31T08:50:08.257 回答
6

正如您所发现的,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因为它的速度要快得多。

于 2013-07-31T11:26:36.967 回答