#include #include #include #include using namespace std; double get_cpu_time() { rusage ruse; getrusage(RUSAGE_SELF, & ruse); return ruse.ru_utime.tv_sec + ruse.ru_utime.tv_usec / 1000000.0 + ruse.ru_stime.tv_sec + ruse.ru_stime.tv_usec / 1000000.0; } long long int calls; int highestn; int A(int m, int n) { if (n > highestn) highestn = n; calls += 1; if (m == 0) return n + 1; if (n == 0) return A(m - 1, 1); return A(m - 1, A(m, n - 1)); } int main(int argc, char * argv[]) { int m = atol(argv[1]); int maxt = 999999; if (argc > 2) maxt = atol(argv[2]); long long int ca[16]; int last = 0; for (int n = 0; n < 16; n += 1) { calls = 0; highestn = 0; double t1 = get_cpu_time(); int r = A(m, n); double t2 = get_cpu_time(); double t = t2 - t1; cout << "m = " << m << ", n = " << setw(2) << n << " A(m, n) = " << setw(12) << r << ", calls = " << setw(12) << calls << ", time = " << t << "\n"; cout << " highest n = " << highestn << "\n"; ca[n] = calls; last = n; if (t > maxt) break; } for (int lev = 0; true; lev += 1) { int first = ca[0]; bool same = true; cout << "level " << lev << ":"; for (int i = 0; i <= last - lev; i += 1) { cout << " " << ca[i]; if (i > 0) ca[i - 1] = ca[i] - ca[i - 1]; if (ca[i] != first) same = false; } cout << "\n"; if (same) break; } }