Tail Call Optimization - Tensho97/Aprende-a-Aprender GitHub Wiki

Al aplicar recursividad, una función requiere invocarse a si misma con otros argumentos hasta alcanzar el caso deseable. Esta técnica tiene sus ventajas y desventajas respecto a la programación iterativa: suele simplificar mucho el algoritmo pero suele ser más lenta y sobre todo, es muy propensa al desbordamiento de la pila de ejecución (stack overflow).

Tail Call Optimization es un mecanismo que nos permite solventar la desventaja mencionada anteriormente al evitar que se genere un frame para cada una de las llamadas en un método. Pensemos en el siguiente ejemplo:

System.out.print(obtenerAreaDeUnCirculo(3))

	public int calcularFactorial(int numero) {

	if (numero == 1)
		return 1;
	
	else 
		return factorial (numero -1) * numero;

}

Básicamente, tenemos un instrucción que debe llamar a un método que necesita llamarse así mismo antes de alcanzar el resultado deseado. Esto supone que el frame de cada llamada deba esperar el resultado del nuevo frame que ha invocado, por lo que en algún momento tendremos multiples frame en la pila de ejecución, contenedores que almacenan las datos y su dirección de retorno. En ciertos casos, como por ejemplo al aplicar Recursividad, esto puede ser un gran problema.

La idea detrás de Tail Call es pasar el resultado parcial en cada llamada en vez de esperar a que sea ésta la que lo devuleva, de modo que en la última llamada ya se tenga el resultado final. De esta manera, el compilador/intérprete, si es capaz de analizarlo, detecte que no es necesario almacenar el frame de cada invocación en la pila de ejecución.

Para ello, es necesario que la llamada a un función sea lo último que hagamos en cada método de manera que todos los cálculos estén resueltos y la información pueda ser enviada.

El uso más común del Tail Call Optimization se conoce como Tail Recursion.

El Tail Recursion es la técnica mediante la cual una función recursiva escrita de forma apropiada, se aprovecha de las ventajas de TCO y mantiene un consumo de pila constante.



Autor: Richard