//  Mögliche Lösung zu Aufgabe 15
#include <iostream>
#include <ctime>
using namespace std;


unsigned long ackermann ( unsigned long x, unsigned long y) {
    if (x == 0)
         return y + 1;
    else if (y == 0)
         return ackermann (x-1, 1);
    else
         return ackermann (x-1, ackermann (x, y-1));
}//ackermann


int main () {
    clock_t start = clock ();
    unsigned long ul = ackermann (3, 12);
    clock_t ende = clock ();

    double dauer = (double) (ende-start) / CLOCKS_PER_SEC;

    cout << "ackermann (3, 12) = " << ul << endl;
    cout << "Dauer = " << dauer << " sec." << endl;
}//main


/*

Nach g++ aufg15a.cpp
ackermann (3, 12) = 32765
Dauer = 7.246 sec.


Nach g++ -O1 aufg15a.cpp
ackermann (3, 12) = 32765
Dauer = 6.84 sec.


Nach g++ -O2 aufg15a.cpp
ackermann (3, 12) = 32765
Dauer = 2.754 sec.


Nach  g++ -O3 aufg15a.cpp
ackermann (3, 12) = 32765
Dauer = 1.111 sec.


Nach g++ -O4 aufg15a.cpp
//  -O4 gleichwertig zu -O3
ackermann (3, 12) = 32765
Dauer = 1.126 sec.


Nach g++ -O5 aufg15a.cpp
//  -O5 gleichwertig zu -O3
ackermann (3, 12) = 32765
Dauer = 1.127 sec.

*/
