Как создать список из диапазона
Я новичок в Scala, только начал учиться, поэтому это основной вопрос начинающего.
Я пытаюсь реализовать алгоритм Sieve of Eratosthenes. Вот что я получил до сих пор:
def sieve_core(cross: Int, lst: Seq[Int]): List[Int] = {
val crossed = lst.filter(_ % cross != 0)
crossed match {
case a :: rest => cross :: sieve_core(a, crossed)
case _ => cross :: Nil
}
}
def sieve(max: Int): List[Int] = {
sieve_core(2, (2 to max))
}
println(sieve(100))
Результат:
List(2)
Насколько я понимаю, case _ => cross :: Nil
соответствует первой итерации sieve_core
, что означает, что crossed
не является экземпляром списка.
Я изменил тип параметров lst
на List[Int]
, и теперь код не будет компилироваться с ошибкой:
(fragment of Problem3.scala):24: error: type mismatch;
found : Range.Inclusive
required: List[Int]
sieve_core(2, (2 to max))
^
По-видимому, Range
не является List
.
Вопрос: как я могу превратить Range в список? Или это какая-то большая проблема с моим кодом, я сделал какое-то плохое предположение где-то на этом пути?
Любая помощь была оценена.
Ответы
Ответ 1
Существует метод apply
на объекте List
, который принимает диапазон и возвращает List
:
scala> List.range(2, 11)
res0: List[Int] = List(2, 3, 4, 5, 6, 7, 8, 9, 10)
В документации коллекции List
есть много полезных List
factory методов .
Ответ 2
Чтобы превратить любую последовательность s
в список, используйте s.toList
Я уверен, что digitalross 'более эффективен в этом случае.
Ответ 3
(2 to max)
От (2 to max)
на самом деле не является scala.collection.immutable.List, а scala.collection.immutable.Range, точнее, экземпляром scala.collection.immutable.Range.Inclusive
, как указано в сообщении об ошибке. Просто мимоходом отметим, что Inclusive
и Exclusive
сами являются членами Range
, с довольно авто-пояснительным значением.
К счастью, класс Range предлагает удобный метод toList
, который вы можете использовать для преобразования диапазона в список и решения проблемы, как в следующем фрагменте кода:
scala> val max = 10
max: Int = 10
scala> val r = (2 to max)
r: scala.collection.immutable.Range.Inclusive = Range 2 to 10
scala> val l = r.toList
l: List[Int] = List(2, 3, 4, 5, 6, 7, 8, 9, 10)