#include #include // gcc ackermann.c -lgmp -o ackermann static mpz_t k; void f(mpz_t r, mpz_t n, mpz_t m) { mpz_t one,nMinus1,mMinus1,result; mpz_add_ui( k,k,1); /* printf("f("); */ /* mpz_out_str( stdout, 10, n); */ /* printf(","); */ /* mpz_out_str( stdout, 10, m); */ /* printf(")\n"); */ if (mpz_cmp_ui( n,0) == 0) { mpz_add_ui( r,m,1); } else if (mpz_cmp_ui( m,0) == 0) { mpz_init( nMinus1); mpz_sub_ui( nMinus1,n,1); mpz_init_set_ui( one,1); f( r,nMinus1,one); mpz_clear( one); mpz_clear( nMinus1); } else { mpz_init( mMinus1); mpz_sub_ui( mMinus1,m,1); mpz_init( result); f( result,n,mMinus1); mpz_clear( mMinus1); mpz_init( nMinus1); mpz_sub_ui( nMinus1,n,1); f( r,nMinus1,result); mpz_clear( nMinus1); mpz_clear( result); } } int main ( int argc, char *argv[]) { mpz_t m,n,r; if (argc != 3) { fprintf(stderr,"usage: ackermann n m\n"); return 1; } mpz_init( n); mpz_init( m); mpz_init( r); mpz_init_set_ui(k,0); mpz_set_str( n, argv[1], 0); mpz_set_str( m, argv[2], 0); f(r,n,m); printf("result = "); mpz_out_str( stdout, 10, r); printf("\n"); printf("calls = "); mpz_out_str( stdout, 10, k); printf("\n"); mpz_clear( r); mpz_clear( m); mpz_clear( n); return 0; }