Las listas son una estructura recursiva, la cual esta compuesta por dos cosas
- Un elemento (head)
- Una cola (tail) que es una Lista
El caso base de las listas son la lista vacia
El operador para definir listas es cons (::)
scala> 1 :: 2 :: 3 :: 4 :: List()
val res1: List[Int] = List(1, 2, 3, 4)
scala> (1 :: (2 :: (3 :: (4 :: List()))))
val res1: List[Int] = List(1, 2, 3, 4)
Siempre tener presente que el operador ::
- Recibe un elemento y una lista, está en notación infija
- Es asociativo a la derecha
Operaciones¶
Dado x como una Lista tenemos
- x. head retorna la cabeza
- x.tail retorna la cola (lista)
- x.length retorna el tamaño
- x.splitAt(n) retorna dos listas la primera cn los n primer elementos y la segunda con el resto
scala> val x = List(1,2,3,4,5,6) val x: List[Int] = List(1, 2, 3, 4, 5, 6) scala> x.splitAt(3) val res6: (List[Int], List[Int]) = (List(1, 2, 3),List(4, 5, 6)) - x.drop(n) elimina los primeros n elementos
- x.take(n) retorna una lista con los primero n elementos
- x(3) retorna el cuarto elemento, x.tail.tail.tail.head
- ++ concatena dos listas
- +. inserta un elemento al final
Otra información:
- https://docs.scala-lang.org/overviews/scala-book/list-class.html
- https://www.scala-lang.org/api/current/scala/collection/immutable/List.html
Como trabajar listas¶
Las vamos a trabajar de forma recursiva, asumiendo que el caso base es la lista vacia
import scala.annotation.tailrec
object Listas {
def suma(l:List[Int]):Int = {
@tailrec
def sumaR(l:List[Int])(acc:Int):Int = {
if (l.isEmpty) acc
else sumaR(l.tail)(l.head + acc)
}
sumaR(l)(0)
}
@tailrec
final def cuadrado(l:List[Int])(acc:List[Int]):List[Int] = {
if (l.isEmpty) acc
else cuadrado(l.tail)(acc ++ List(l.head*l.head))
}
def main(args: Array[String]):Unit = {
val l = List(1,2,3,4,5)
println(suma(l))
println(cuadrado(l)(List()))
}
}