some workaround to avoid condeval creating Phibs which not all backends like
[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     if (y < x)
30         return Tak( Tak(x-1, y, z), Tak(y-1, z, x), Tak(z-1, x, y) );
31     return z;
32 }
33
34 double TakFP(double x, double y, double z) {
35     if (y < x)
36         return TakFP( TakFP(x-1.0, y, z), TakFP(y-1.0, z, x), TakFP(z-1.0, x, y) );
37     return z;
38 }
39
40 int main(int argc, char **argv) {
41     int n = 7;
42
43         if(argc > 1)
44                 n = atoi(argv[1]) - 1;
45     printf("Ack(3,%d): %d\n", n+1, Ack(3, n+1));
46     printf("Fib(%.1f): %.1f\n", 28.0+n, FibFP(28.0+n));
47     printf("Tak(%d,%d,%d): %d\n", 3*n, 2*n, n, Tak(3*n, 2*n, n));
48     printf("Fib(3): %d\n", Fib(3));
49     printf("Tak(3.0,2.0,1.0): %.1f\n", TakFP(3.0, 2.0, 1.0));
50     return 0;
51 }