Tutoriales de informática - Abrirllave.com

Abrirllave.com

Recursividad en Java

En programación, cuando una función (en Java es un método) se llama a sí misma, se dice que se está haciendo uso de la recursividad. Al respecto, hay que saber que, cualquier solución que resuelva recursivamente un problema, también se puede resolver de forma iterativa.

EJEMPLO { Factorial } Se quiere escribir un programa que solicite un número entero al usuario y, a continuación, calcule y muestre el factorial de dicho número. Ahora bien, si el número introducido no es mayor que cero, se mostrará el siguiente mensaje: "ERROR: el número debe ser mayor que cero".

Nota: El factorial de un número natural (n!) se obtiene multiplicando todos los números que hay entre el uno (1) y dicho número (n), ambos inclusive. Por ejemplo, el factorial de 5 es el resultado de multiplicar 1 * 2 * 3 * 4 * 5, es decir, 5! = 120.

En la pantalla se verá, por ejemplo:

Ejecución del programa Factorial escrito en Java, donde se muestra por pantalla el factorial de un número introducido por teclado.

En Java, sin hacer uso de la recursividad, el problema se puede resolver escribiendo por ejemplo:

import java.util.Scanner;

public class Factorial
{
    public static void main(String[] args)
    {
        int n;
        Scanner teclado = new Scanner(System.in);

        System.out.print("Introduzca un número: ");
        n = teclado.nextInt();

        if(n > 0)
        {
        System.out.printf("%d! = %d", n, factorial(n));
        }
        else
        {
            System.out.printf("ERROR: El número debe ser mayor que cero.");
        }
    }

    private static int factorial(int numero)
    {
        int contador, resultado;

        resultado = numero;

        while(numero > 2)
        {
            numero -= 1;
            resultado *= numero;
        }

        return resultado;
    }
}

Por otra parte, para resolver el problema de manera recursiva, se puede escribir:

import java.util.Scanner;

public class Factorial2
{
    public static void main(String[] args)
    {
        int n;
        Scanner teclado = new Scanner(System.in);

        System.out.print("Introduzca un número: ");
        n = teclado.nextInt();

        if(n > 0)
        {
        System.out.printf("%d! = %d", n, factorial(n));
        }
        else
        {
            System.out.printf("ERROR: El número debe ser mayor que cero.");
        }
    }

    private static int factorial(int numero)
    {
        int resultado;

        if(numero != 1)
        {
            resultado = factorial(numero - 1) * numero;
        }
        else
        {
            resultado = 1;
        }
        return resultado;
    }
}

Nótese que, el método factorial se invoca a sí mismo en la sentencia:

resultado = factorial(numero - 1) * numero;

Determinados problemas se pueden resolver tanto de modo iterativo como recursivo. Ahora bien, hay que tener en cuenta que, aunque la solución recursiva suele ser más elegante que la solución iterativa, esta suele usar menos memoria en su ejecución.