Scala中的一个更大的循环

Dra*_*mes 4 functional-programming scala folding

我正在使用Scala来创建一个程序,但我正在试验一个循环可以做多少迭代的墙.在Scala中进行函数式编程和编程时,我仍然很新,但这就是我现在所拥有的:

val s = Range(1, 999999999).view.foldLeft(0)(_ + _ / whatever);
Run Code Online (Sandbox Code Playgroud)

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

谁知道如何实现这一目标?

谢谢.

Deb*_*ski 6

(BigInt(1) to BigInt(999999999)).view.foldLeft(BigInt(0))(_ + _ / whatever)
Run Code Online (Sandbox Code Playgroud)

或类似的东西

BigInt("89893798138989379873")
Run Code Online (Sandbox Code Playgroud)

如果你有足够的时间陪伴你.

例如:

scala> (BigInt(0) to BigInt("2000000000000000") by BigInt("2000000000")).view.foldLeft(BigInt(0))(_ + _)
res: scala.math.BigInt = 1000001000000000000000
Run Code Online (Sandbox Code Playgroud)


Lui*_*hys 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)
Run Code Online (Sandbox Code Playgroud)

然后

bigIterator(0, BigInt("3000000000")).foldLeft(BigInt(0))(_ + _)
Run Code Online (Sandbox Code Playgroud)

等会工作.注意:如果您不需要全部范围BigInt,请使用Long它,因为它明显更快.