我正在学习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}}
丑陋,对吧?
答案 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)
输出格式留给读者练习。