Funciones recursivas en Java // Empleando recursión para sumar un array de números
La recursión o recursividad es uno de los métodos en ciencias de la computación que se pueden utilizar para resolver un problema. Java es un lenguaje orientado a objetos muy potente que permite utilizar la recursividad. Si buscamos recursión en Wikipedia encontraremos esta definición:
Recursión, en matemáticas y ciencias de la computación, es un método para definir funciones en el cual la función que está siendo definida se aplica dentro de su propia definición.
Esto significa que una función se llamará a sí misma indefinidamente. Sin embargo, a menudo se hace de tal manera que la función se llamará a sí misma hasta que alcance una cierta condición y se detenga. Esta condición también se llama caso base.
Hay muchas páginas donde puedes encontrar grandes explicaciones sobre la teoría de la recursión. La mayoría de ellas utilizan el ejemplo de las Torres de Hanoi:
En esta publicación, voy a mostrarte un ejemplo sencillo de recursión en Java. Voy a usarlo para sumar un array de números. El ejemplo ilustra lo fácil que es usar la recursión y lo útil que puede ser.
import java.math.BigDecimal;
public class Recursion {
public static void main(String[] args) {
// Creamos el array de numeros que queremos sumar,
// Puede ser cualquier subclase de java.lang.Number
Number[] test = {100, 0.05d, 1391L, 88d, 99d, 0.0037, 0.05d, 0.05d, 88d, 99d, -528.15, 0.13f};
// Llamamos a nuestra funcion recursiva
System.out.println(sum(test));
}
// Esta es la funcion inicial
// Llama a la funcion recursiva con los valores iniciales por defecto
static Number sum(Number[] numbers) {
if (numbers.length < 1) {
return 0;
}
return sum(BigDecimal.valueOf(0), numbers, numbers.length - 1);
}
// La funcion recursiva
static Number sum(BigDecimal initialValue, Number[] numbers, int location) {
// Si hemos llegado al final del array devolvemos el resultado final (caso base)
if (location < 0) {
return initialValue;
}
// En caso contrario, llamamos a la funcion recursiva con el siguiente numero del array
else {
int nextLocation = location - 1;
Number current = numbers[location];
// Convertimos el numero actual a BigDecimal
// Ahora podemos sumarlo al initialValue con precision (o realizar cualquier operacion aritmetica)
return sum(initialValue.add(new BigDecimal(current.toString())), numbers, nextLocation);
}
}
}