November 17, 2024

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.

Leave a Reply

Your email address will not be published. Required fields are marked *