// lab07.cpp  (c) 2000 adolfo@di-mare.com

/** \file  lab07.cpp
    \brief Programa las funciones Factorial y de Fibonacci:
    <PRE>
        n! == n * (n-1) * (n-2) .... * 2 * 1   // Factorial

        F    = F  + F       F  == 1   F == 1   // Fibonacci
         n      n-1  n-2     0         1
    </PRE>
    \author Adolfo Di Mare <adolfo@di-mare.com>
    \date   2000
*/

#include <iostream> // #include <iostream.h>

/** Calcula el valor de la serie de Fibonacci para \c "n".
    <PRE>
        F    = F  + F       F  == 1   F == 1
         n      n-1  n-2     0         1
    </PRE>
*/
long Fibonacci(long n) {
    if (n <= 1) {
        return 1;
    }
    else {
        long F1 = Fibonacci(n-1);
        long F2 = Fibonacci(n-2);
        return F1 + F2;
//      return Fibonacci(n-1) + Fibonacci(n-2);
    }
} // Fibonacci()

/** Calcula n!, el valor del factorial de \c "n".
    <PRE>
    n! == n * (n-1) * (n-2) .... * 2 * 1
    </PRE>
*/
long Factorial(long n) {
    if (n <= 1) {
        return 1;
    }
    else {
        return n * Factorial(n-1);
    }
} // Factorial()

/** Graba valores recursivamente a partir de \c "valor".
*/
int queImprimo( int valor ) {
    cout << " :: Entro " << valor;
    if ( valor <= 1 ) {
        cout << " -> Final " << valor;
        return valor;
    }
    else {
        int temp = 0;
        temp = 2 + queImprimo(valor - 1);
        cout << " ~~ Temporal " << temp;
        return temp;
    }
}

/// Programa principal.
int main() {
    const N = 13; // cantidad de valores calculados 
    cout << endl;
    for (long i = 0; i<N; ++i) {
        cout << "Fibonacci(" << i << ") == " << Fibonacci(i) << endl;
    }

    cout << endl;
    for (i = 0; i<N; ++i) {
        cout << "Factorial(" << i << ") == " << Factorial(i) << endl;
    }

    cout << endl; queImprimo( 0 );
    cout << endl; queImprimo( 3 );
    cout << endl;

    return 0;
} // main()

// EOF: lab07.cpp