我在Scala的循环中遇到了问题: 在java中,我可以这样做:
for(int i=1;i<list.length;i=i*2
但我怎么能在scala中做同样的事情? Scala的索引不能改变
答案 0 :(得分:4)
scanLeft
方法在那里可能会有所帮助:
def exps(n: Int, p: Int) = (0 until n).scanLeft(1)((acc, _) => acc * p)
val list = List(2, 3, 5, 7)
for (i <- exps(list.size, 2)) println(i)
1
2
4
8
16
或使用无限流:
def expStream(p: Int, i: Int = 1): Stream[Int] = i #:: expStream(p, i * p)
for (i <- expStream(2).take(list.size)) println(i)
你也可以使用Stream.iterate
(这有点简洁),正如Gyro Gearless在答案中所说:
def expStream(p: Int) = Stream.iterate(1)(_ * p)
答案 1 :(得分:3)
惯用的方法是从函数“* 2”创建一个Stream:
import Stream._
val potsOfTwo = Stream.iterate (1) (_ * 2).takeWhile (_ < 1000)
potsOfTwo.foreach { println _ }
阶&GT; potsOfTwo.foreach {println _} 1 2 4 8 16 32 64 128 256 512