//---------------------------------------------------------------------------
//
//  Time-stamp: <2003-08-23 06:28:57 sutner> 
//
// :File:      Ackermann.cc
// :Purpose:   Ackermann function
// 
//---------------------------------------------------------------------------

#include  <iostream>
#include  <getopt.h>
#include  <stdlib.h>

using namespace std;

const char *usage =
"  arg1 arg2   ... better be small integers";

int getopt(int argc, char * const argv[], const char *optstring);

void  process_commandline( int argc, char* const argv[], int& x, int& y )
{
   extern int   optind;
   extern char *optarg;

   if( argc != 3 )
   {
      cerr << "Usage: " << argv[0] << usage << endl;
	exit(1);
   }

   x = atoi( argv[optind++] );
   y = atoi( argv[optind] );
}

int acker(int x, int y) 
{ 
   return( x ? ( acker( x-1, y ? acker( x, y-1 ) : 1 ) ) : y+1 ); 
}

//--------------------------------------------------------------------------------

int main(int argc, char *argv[]) 
{
   int x, y;

   process_commandline( argc, argv, x, y );

   cout <<  x << ":" << y << " --> " << acker(x,y) << endl;
   return(0);
}

//--------------------------------------------------------------------------------
// eof

