我正在尝试在scala中编写一个函数式方法,以获取1和1之间所有数字的列表。可被3或5整除的1000
这是我到目前为止所做的:
def getListOfElements(): List[Int] = {
val list = List()
for (i <- 0 until 1000) {
//list.
}
list match {
case Nil => 0
}
list
}
for循环似乎是一种必要的方法,我不确定在案例类中要匹配什么。请一些指导?
答案 0 :(得分:6)
以下是我使用for
表达式的方法。
for( i <- 1 to 1000 if i % 3 == 0 || i % 5 == 0) yield i
这给出了:
scala.collection.immutable.IndexedSeq[Int] = Vector(3, 5, 6, 9, 10, 12, 15, 18, 20, 21...
这是另一种过滤Range
数字的方法。
scala> 1 to 1000
res0: scala.collection.immutable.Range.Inclusive = Range(1, 2, 3, 4, 5, 6, 7, 8, 9, 10...
scala> res0.filter(x => x % 3 == 0 || x % 5 == 0)
res1: scala.collection.immutable.IndexedSeq[Int] = Vector(3, 5, 6, 9, 10, 12, 15, 18, 20, 21...
如果您确实希望返回值为List
,请使用toList
。例如res0.toList
。
答案 1 :(得分:4)
(Range(3, 1000, 3) ++ Range(5, 1000, 5)).toSet.toList.sorted
可以省略排序。
答案 2 :(得分:3)
另一种方法:
(1 to 1000).filter(i => i % 3 == 0 || i % 5 == 0)
答案 3 :(得分:2)
看起来Brian打败了我:)
我只是想提一下,为了获得更好的性能,可能会更优选Stream:
val x = (1 until 1000).toStream //> x : scala.collection.immutable.Stream[Int] = Stream(1, ?)
x filter (t=>(t%3==0)||(t%5==0)) //> res0: scala.collection.immutable.Stream[Int] = Stream(3, ?)
答案 4 :(得分:2)
projecteuler.net的问题也想在最后加上这些数字的总和。
&#34;求出低于1000的所有3或5的倍数之和。&#34;
object prb1 {
def main(args: Array[String]) {
val retval = for{ a <- 1 to 999
if a % 3 == 0 || a % 5 == 0
} yield a
val sum = retval.reduceLeft[Int](_+_)
println("The sum of all multiples of 3 and 5 below 1000 is " + sum)
}
}
正确答案应为 233168
答案 5 :(得分:0)
没有分组或列表重新创建,没有任何答案。递归没有任何答案。
此外,任何基准测试?
@scala.annotation.tailrec def div3or5(list: Range, result: List[Int]): List[Int] = {
var acc = result
var tailList = list
try {
acc = list.drop(2).head :: acc // drop 1 2 save 3
acc = list.drop(4).head :: acc // drop 3 4 save 5
acc = list.drop(5).head :: acc // drop 5 save 6
acc = list.drop(8).head :: acc // drop 6 7 8 save 9
acc = list.drop(9).head :: acc // drop 9 save 10
acc = list.drop(11).head :: acc // drop 10 11 save 12
acc = list.drop(14).head :: acc // drop 12 13 14 save 15
tailList = list.drop(15) // drop 15
} catch {
case e: NoSuchElementException => return acc // found
}
div3or5(tailList, acc) // continue search
}
div3or5(Range(1, 1001), Nil)
修改
scala> val t0 = System.nanoTime; div3or5(Range(1, 10000001), Nil).toList;
(System.nanoTime - t0) / 1000000000.0
t0: Long = 1355346955285989000
res20: Double = 6.218004
对我来说很好的答案之一:
scala> val t0 = System.nanoTime; Range(1, 10000001).filter(i =>
i % 3 == 0 || i % 5 == 0).toList; (System.nanoTime - t0) / 1000000000.0
java.lang.OutOfMemoryError: Java heap space
另一个:
scala> val t0 = System.nanoTime; (Range(1, 10000001).toStream filter (
(t: Int)=>(t%3==0)||(t%5==0))).toList ; (System.nanoTime - t0) / 1000000000.0
java.lang.OutOfMemoryError: Java heap space
第一个:
scala> val t0 = System.nanoTime; (for( i <- 1 to 10000000 if i % 3 == 0 ||
i % 5 == 0) yield i).toList; (System.nanoTime - t0) / 1000000000.0
java.lang.OutOfMemoryError: Java heap space
为什么Scala不优化例如Vector - &gt;列表?