Foros aprenderaprogramar.com

Aprender a programar => Aprender a programar desde cero => Mensaje iniciado por: bartvander en 14 de Marzo 2013, 12:58

Título: Algoritmo recursivo factorial: ejemplo explicación clara
Publicado por: bartvander en 14 de Marzo 2013, 12:58
Bueno pues estoy con los algoritmo recursivos y no soy capaz de saber como función. Pongo un ejemplo:

int factorial (int n)
    if (n==0) return 1;
    else return n*factorial(n-1)

yo entiendo que le metes un número n y como llama a la misma función dentro del metodo se va llamando recursivamente. Mi duda es cuando llega a n=0 tendría que devolver 1 y sin en cambio devuelve el factorial de n. Me podrías explicar como va funcionando este bucle. Otra de las dudas que me surgen es se realiza el primer bucle y donde se guarda el resultado de ese bucle, por ejemplo:

si queremos el factorial de 5, en la primera vuelta sería:

return 5 + factorial (n-1) que es 4= 20. devuelve ese valor, pero no lo almacena para sumar el siguiente resultado.
Título: Re:Algoritmo recursivo
Publicado por: javi in the sky en 14 de Marzo 2013, 14:52
Si llamas por ejemplo al factorial de 5 el proceso es:

Devuelve 5 * factorial (4) entra en primera recursión
factorial (4) devuelve 4 * factorial (3) entra en segunda recursión
factorial (3) devuelve 3 * factorial (2) entra en tercera recursión
factorial (2) devuelve 2 * factorial (1) entra en cuarta recursión
factorial (1) devuelve 1 * factorial (0) entra en quinta recursión
factorial (0) devuelve 1 y termina la quinta recursión que devuelve 1*1

termina la cuarta recursión que devuelve 2*1
termina la tercera recursión que devuelve 3*2*1
termina la segunda recursión que devuelve 4*3*2*1
termina la primera recursión que devuelve 5*4*3*2*1

Si ejecutas esto
Código: [Seleccionar]
public class prueba {

    public static void main (String[] Args){
        System.out.println ("Resultado de factorial de 5 es "+ factorial(5)); 
    }

    static    int factorial (int n){
        if (n==0) { System.out.println ("Caso base"); return 1;}
        else{
            System.out.println ("Recursión");
            return n*factorial(n-1);}
    }
}

El resultado es

Recursión
Recursión
Recursión
Recursión
Recursión
Caso base
Resultado de factorial de 5 es 120


Es decir, cinco recursiones, se llega al caso base y devuelve el resultado


Título: Re:Algoritmo recursivo
Publicado por: bartvander en 14 de Marzo 2013, 15:02
lo de los resultados lo entiendo que salga 5*4*3*2*1, pero cuando n=0 lo que devuelve es 1, este sería el último resultado que devuelve no? no veo ninguna varible que acumule este resultado y que luego devuelva ese valor. En algún sitio estoy perdido.
Título: Re:Algoritmo recursivo
Publicado por: bartvander en 14 de Marzo 2013, 15:13
Ok ya lo entendí.

hace:

n*factorial de (n-1) = 5 y hace la función otra vez que quedará 5*4*FACTORIAL (n-1)... y así hasta que llega a n=0 que sería 1 y por o tanto quedaría 5*4*3*2*1.

Es el primer algoritmo que veo recursivo y me ha costado comprenderlo.