/* File: fibonacci.cpp
 * Program computes Fibonacci numbers recursively and iteratively
 *
 * Input:  n, an integer
 * Output: nth Fibonacci number
 ***********************************************************/

#include <iostream>
using namespace std;

unsigned int FibRec (unsigned int n);
unsigned int FibIter (unsigned int n);

int main ()
{
   unsigned int n;

   cout << "Please enter a non-negative integer: ";
   cin >> n;

   cout << "The nth Fibonacci number computed recursively: "
	<< FibRec(n) << endl;
   cout << "The nth Fibonacci number computed iteratively: "
	<< FibIter(n) << endl;

   return 0;
}  // end main

unsigned int FibRec (unsigned int n)
{
   if (n <= 1)
      return n;
   // else
   return FibRec(n-1) + FibRec(n-2);
}  // end FibRec


unsigned int FibIter (unsigned int n)
{
   unsigned int fib1 = 1,     // Fib(n-1)
                fib2 = 0,     // Fib(n-2)
                current;      // current computed Fibonacci number

   if (n <= 1)
      return n;
   // else
   for (int i=2; i <= n; i++)
   {
      current = fib1+fib2;   // Fib(n) = Fib(n-1) + Fib(n-2)
      fib2 = fib1;           // update for next round
      fib1 = current;
   }  // end for
   return current;
}  // end main
