Muy buenas. El otro día se me pidió un ejercicio, en el que debía realizar un método que devolviese el número más pequeño dentro de un array, llamando a dicha función desde el bloque main y pudiendo emplear la función Math.min. Además, tenía que hacerlo mediante recursión de cola (
tail recursion).
Entrego a la profesora dicho código:
static int minArrayRecursiva1 (int[] arr)
{
return minArrayAux1 (arr, 0);
}
static int minArrayAux1 (int[] arr, int ind)
{
if (ind == arr.length - 1)
{
return arr[ind];
}
else
{
return Math.min (arr[ind], minArrayAux1 (arr, ind + 1));
}
}
Pero, mi sorpresa fue cuando me dijo que el código era correcto, pero la recursión empleada era sin cola. Y me enseña su versión del código:
static int minArrayRecursiva2 (int[] arr)
{
return minArrayAux2 (arr, 1, arr[0]);
}
static int minArrayAux2 (int[] arr, int ind, int min)
{
if (ind == arr.length)
{
return min;
}
else
{
return minArrayAux2 (arr, ind + 1, Math.min (min, arr[ind]));
}
}
Dado esto, claramente no he comprendido muy bien el concepto de recursión de cola y sin cola. Me lo explicaron con el "clásico" ejemplo de calcular el factorial de un número, pero aplicado a este método, no lo veo muy claro.
Yo tenía entendido que una recursión es de cola si se emplea un método auxiliar o mediante 'wrapping', para que la última llamada del método "principal" sea a sí misma.
Agradecería si alguien me pudiese aclarar este concepto y su aplicación.
¡Gracias!
Un saludo