Los loops y la recursión son herramientas esenciales en la programación, y Scala proporciona una serie de formas para implementarlos. En este artículo, discutiremos cómo utilizar loops y la recursión en Scala, y presentaremos ejemplos de ambos en acción.
Loops en Scala
Los loops en Scala se implementan utilizando los constructos while
y for
. La sintaxis básica para while
es:
while (condición) {
// cuerpo del bucle
}
La condición se evalúa en cada iteración del bucle, y mientras sea verdadera, el cuerpo del bucle se ejecutará. Cuando la condición se evalúa como falsa, el bucle termina.
El siguiente ejemplo utiliza un bucle while
para imprimir los números del 1 al 5:
var i = 1
while (i <= 5) {
println(i)
i += 1
}
La sintaxis básica para for
es:
for (variable <- rango) {
// cuerpo del bucle
}
variable
es una variable que se utiliza para iterar a través del rango especificado. rango
puede ser un rango de valores o una colección de datos. El siguiente ejemplo utiliza un bucle for
para imprimir los números del 1 al 5:
for (i <- 1 to 5) {
println(i)
}
to
es un método en la clase Int
que devuelve un rango de valores desde el valor inicial hasta el valor final especificado.
Tail recursion en Scala
La recursión es una técnica de programación en la que una función se llama a sí misma para resolver un problema más pequeño. Sin embargo, en algunos casos, la recursión puede ser ineficiente y provocar desbordamiento de pila. La recursión de cola (tail recursion) es una técnica que permite evitar el desbordamiento de pila en situaciones en las que se llama a la misma función muchas veces.
En tail recursion, la llamada recursiva es la última acción realizada en la función
. Esto significa que no hay ningún cálculo o procesamiento que se realice después de la llamada recursiva. En lugar de crear una nueva pila de llamadas en cada llamada recursiva, la recursión de cola utiliza la misma pila de llamadas para cada iteración. Esto permite que la recursión sea más eficiente y evita el desbordamiento de pila. En Scala se debe de usar la anotacion @tailrec
para indicarle al compilador que debe tratar a la funcion de esa manera. A continuacion un ejemplo para el calculo del factorial:
def factorial(n: Int): Int = {
@tailrec
def factorialHelper(n: Int, acc: Int): Int = {
if (n == 0) acc
else factorialHelper(n - 1, n * acc)
}
factorialHelper(n, 1)
}
println(factorial(5))
La función factorial
llama a la función auxiliar factorialHelper
para realizar la recursión. @tailrec
es una anotación que asegura que la función es una función recursiva de cola, lo que significa que la llamada recursiva es la última acción realizada en la función.
En este ejemplo, factorialHelper
toma dos argumentos: n
, que es el número para calcular el factorial, y acc
, que es un acumulador que se utiliza para almacenar el valor calculado. Si n
es igual a cero, la función devuelve acc
. De lo contrario, la función llama a factorialHelper
con n-1
y n*acc
. La llamada recursiva se realiza como la última acción en la función, y se almacenan los valores necesarios en el acumulador.