Cómo crear una lista de rango
Pregunta
Soy nuevo en Scala, recién comencé a aprender, así que esta es una pregunta básica para principiantes.
Intento implementar el algoritmo Tamiz de Eratóstenes . Esto es lo que obtuve hasta ahora:
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))
El resultado es:
List(2)
Por lo que yo entiendo, case _ = > cross :: Nil
coincide en la primera iteración de sieve_core
, lo que significa que cruzado
no es una instancia de una Lista.
Cambié el tipo de parámetros de lst
a List [Int]
y ahora el código no se compilará con un error:
(fragment of Problem3.scala):24: error: type mismatch; found : Range.Inclusive required: List[Int] sieve_core(2, (2 to max)) ^
Aparentemente, Range
no es una List
.
Pregunta: ¿Cómo puedo convertir el rango en una lista? ¿O es un problema mayor con mi código? He hecho algunas suposiciones erróneas en algún lugar del camino?
Cualquier ayuda apreciada.
Solución
Hay un método apply
en el objeto complementario List
que toma un rango y devuelve una List
:
scala> List.range(2, 11)
res0: List[Int] = List(2, 3, 4, 5, 6, 7, 8, 9, 10)
Hay muchos métodos de fábrica List
útiles en la documentación de la colección List
.
Otros consejos
Para convertir cualquier secuencia s
en una lista, use s.toList
Estoy seguro de que digitalross 'es más eficiente en este caso, sin embargo.
(2 a max)
no es un scala.collection.immutable.List de hecho, pero a scala.collection.immutable.Range , más precisamente una instancia de scala.collection.immutable.Range.Inclusive
, como se menciona en su mensaje de error. De pasada, tenga en cuenta que Inclusive
y Exclusive
son miembros de Range
, con un significado bastante autoexplicativo.
toList
, que puede aprovechar para convertir el rango en una lista y resolver el problema, como en el siguiente fragmento de código:
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)