- Split bearch.h correctly into bearch.h and bearch_t.h
[libfirm] / ir / be / test / langshootout / recursive.c
1 // The Computer Language Shootout
2 // http://shootout.alioth.debian.org/
3 // recursive test, by bearophile, Jan 24 2006
4 // Compile with: -O3 -s -fomit-frame-pointer -funroll-loops
5
6 //#include <stdio.h>
7
8 int Ack(int x, int y) {
9     if (x == 0)
10         return y+1;
11     if (y == 0)
12         return Ack(x-1, 1);
13     return Ack(x-1, Ack(x, y-1));
14 }
15
16 int Fib(int n) {
17     if (n < 2)
18         return 1;
19     return Fib(n-2) + Fib(n-1);
20 }
21
22 double FibFP(double n) {
23     if (n < 2.0)
24         return 1.0;
25     return FibFP(n-2.0) + FibFP(n-1.0);
26 }
27
28 int Tak(int x, int y, int z) {
29         printf("X %d Y %d Z %d\n", x, y, z);
30     if (y < x)
31         return Tak( Tak(x-1, y, z), Tak(y-1, z, x), Tak(z-1, x, y) );
32     return z;
33 }
34
35 double TakFP(double x, double y, double z) {
36     if (y < x)
37         return TakFP( TakFP(x-1.0, y, z), TakFP(y-1.0, z, x), TakFP(z-1.0, x, y) );
38     return z;
39 }
40
41 int main(int argc, char **argv) {
42     int n = 7;
43
44         if(argc > 1)
45                 n = atoi(argv[1]) - 1;
46     printf("Ack(3,%d): %d\n", n+1, Ack(3, n+1));
47     printf("Fib(%.1f): %.1f\n", 28.0+n, FibFP(28.0+n));
48     printf("Tak(%d,%d,%d): %d\n", 3*n, 2*n, n, Tak(3*n, 2*n, n));
49 #if 0
50     fprintf(stderr, "Fib(3): %d\n", Fib(3));
51     fprintf(stderr, "Tak(3.0,2.0,1.0): %.1f\n", TakFP(3.0, 2.0, 1.0));
52 #endif
53     return 0;
54 }