值foreach不是Int的成员?

时间:2015-09-24 01:44:44

标签: scala

我正在学习scala,我需要打印2的幂,其倒数从0到20

我正在做的是

<console>:13: error: value foreach is not a member of Int
       pow <- scala.math.pow(2, i).toInt
                                   ^

但我认为错误是

pow

我知道scala> for(i <- 0 to 10) println(scala.math.pow(2, i).toInt + "\t" + 1/scala.math.pow(2,i)) 1 1.0 2 0.5 4 0.25 8 0.125 16 0.0625 32 0.03125 64 0.015625 128 0.0078125 256 0.00390625 512 0.001953125 1024 9.765625E-4 不可迭代,但我怎样才能重新计算它呢?

否则,我将其重新计算为

{{1}}

丑陋,对吧?

2 个答案:

答案 0 :(得分:9)

当您在理解中使用<-时,您需要提供与第一个<-的输出兼容的类型。在这里,您可以从第Seq[Int]行创建i <- 0 to 20,然后从下一行创建Int。相反,您可以只分配中间结果,并在结尾处生成一个列表(然后您可以打印出来或以其他方式使用)。

另外,你应该注意到,通过强制转换到你所做的Int,你可以确保使用整数除法计算倒数,这对于除了第一个幂之外的所有除数都会得到倒数 - 将转换为收益率为Int,因此您有Double倒数。

总体:

val result = for {
     i <- 0 to 20
     pow = scala.math.pow(2, i)
     rec = 1/pow
} yield (pow.toInt + "\t" + rec)

然后您可以使用以下内容打印出结果:

println(result.mkString("\n"))

输出将类似于:

1   1.0
2   0.5
4   0.25
8   0.125
16  0.0625
32  0.03125
64  0.015625
128 0.0078125
256 0.00390625
512 0.001953125
1024    9.765625E-4
2048    4.8828125E-4
4096    2.44140625E-4
8192    1.220703125E-4
16384   6.103515625E-5
32768   3.0517578125E-5
65536   1.52587890625E-5
131072  7.62939453125E-6
262144  3.814697265625E-6
524288  1.9073486328125E-6
1048576 9.5367431640625E-7

此外,您可以更改yield以生成元组列表,然后格式化您稍后选择的格式(将格式与生成分离):

val result = { ... // as before
} yield (i, pow, rec) // Could prove handy to keep the index, and keep pow as a Double for now

def printResults(results: List[(Int, Double, Double)], formatter: (Int, Double, Double) => String) = results forEach { case (n, pow, rec) =>
  println(formatter(n, pow, rec))
}

def egFormatter(n: Int, pow: Double, rec: Double) = s"For n = $n,\t 2^n = ${pow.toInt},\t reciprocal = $rec"

printResults(results, egFormatter)

答案 1 :(得分:2)

使用Streams的一种相当不同的方法提供了一些灵活性(调用者选择输出的长度而不是硬编码)和memoization(在计算了一个值之后,它可以被检索而不是重新计算)。

// pts --> Powers of Two Stream
val pts: Stream[(Int,Double)] = (1,1.0) #:: fs.zipWithIndex.map{x=>
                                   val p = scala.math.pow(2, x._2+1);
                                   (p.toInt, 1/p)}

scala> pts.take(20).mkString("\n")
res11: String =
(1,1.0)
(2,0.5)
(4,0.25)
(8,0.125)
(16,0.0625)
(32,0.03125)
(64,0.015625)
(128,0.0078125)
(256,0.00390625)
(512,0.001953125)
(1024,9.765625E-4)
(2048,4.8828125E-4)
(4096,2.44140625E-4)
(8192,1.220703125E-4)
(16384,6.103515625E-5)
(32768,3.0517578125E-5)
(65536,1.52587890625E-5)
(131072,7.62939453125E-6)
(262144,3.814697265625E-6)
(524288,1.9073486328125E-6)

输出格式留给读者练习。