Recursividad Final y No Final Ramón Costa (2004-06-13)

Un sencillo ejemplo para calcular el factorial de un número recursivamente, con la finalidad de ver la diferencia entre la recursividad Final y la No Final.

/**********************************************************
 *              F A C T O R I A L
 *
 *      Prueba de Recursividad Final y No Final
 *      Data: 12/6/04           Autor: Ramon Costa
 *
 **********************************************************/
 
 #include <iostream.h>
 
 int factorialNoFinal(int num); 
 int factorialFinal(int num,int fact);
 
 int factorialNoFinal(int num)  // recursividad no final
 { // Pre: Verdadero
        int fact;
        
        if (num==0)     // Caso que 'num' valga 0
                fact = 0;
        else {  // resto de casos de 1 hasta N
                if (num==1)
                        fact = 1;
                else
                        fact = factorialNoFinal(num-1)*num;
        }               // a medida que vamos volviendos de las llamadas
                        // recursivas, vamos calculando el factorial    
        return (fact);
        
 // Post: fact = Producto x:1..num:x
 //   fact tendra como valor el producto entre los numeros
 //   existentes entre 1 i 'num'
 }
 
 int factorialFinal(int num, int fact)  // recursividad final
 { // Pre: Verdadero
        
        if (num==0)     // Caso concreto que 'num' valga 0
                fact = 0;
        else {  // resto de casos de 1 hasta N
                if (num==1)
                        fact = 1*fact;
                else
                        fact = factorialFinal(num-1,fact*num);
        }       // cuando volvemos de las llamadas recursivas,
                // ya tenemos calculado el factorial
        return (fact);
        
 // Post: fact = Producto x:1..num:x
 //   fact tendra como valor el producto entre los numeros
 //   existentes entre 1 i 'num'
 }
 
 void main()
 {
        int solucioFinal,solucioNoFinal,num;
        
        cout << endl << "Introduce un numero: " << endl;
        cin >> num;
        cout << endl;
        
        solucioFinal = factorialFinal(num,1);
        solucioNoFinal = factorialNoFinal(num);
        
        cout << "El factorial de " << num << " es: " << endl << endl;
        cout << "               " << "Recursividad Final: " << solucioFinal << endl;
        cout << "               " << "Recursividad No Final: " << solucioNoFinal << endl;
}

Regresar a ejemplos