/**************************************************************************** * * Filename: * * ackermann.c * * Description: * * Ackermann's function "is an example of a recursive function which * is not primitive recursive". It is interesting from the point of * view of benchmarking because it "grows faster than any primitive * recursive function" and gives us a lot of nested function calls * for little effort. * * It is defined as follows: * A(0, n) = n+1 * A(m, 0) = A(m-1, 1) * A(m, n) = A(m-1, A(m, n-1)) * * We use A(3,6) as the benchmark. This used to take long enough to * confirm the execution time with a stopwatch. Nowadays that's out * of the question. BTW, the value of A(4,2) has 19729 digits! * * A (3,6) gives us 172233 calls, with a nesting depth of 511. * * Credits: * * Ackermann's function is named for Wilhelm Ackermann, a * mathematical logician who worked Germany during the first half * if the 20th century. * ****************************************************************************/ #include <time.h> #include <report.h> static int A (int m, int n) { if (m == 0) return n + 1; else if (n == 0) return A (m - 1, 1); else return A (m - 1, A (m, n - 1)); } int main () { int ans; clock_t t1, t2; test ("ackermann", "Function call benchmark, A (3, 6)"); t1 = clock (); ans = A (3,6); t2 = clock (); if (ans != 509) failed ("Result wrong, got %d, expected %d", ans, 509); comment ("time taken = %.3e Seconds", ((double)t2 - (double)t1) / (double)CLOCKS_PER_SEC); result (); }