#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 A(int m, int 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]); long long int ca[16]; for (int n = 0; n < 16; n += 1) { calls = 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"; ca[n] = calls; } for (int lev = 0; true; lev += 1) { int first = ca[0]; bool same = true; cout << "level " << lev << ":"; for (int i = 0; i < 16 - 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; } }