# LSL Recursion Benchmark

(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)
```//
// The Computer Language Shootout
// http://shootout.alioth.debian.org/
//
// contributed by bearophile, Jan 24 2006
// modified by Babbage Linden, Oct 10 2007
//

integer ack(integer x, integer y)
{
if(x == 0)
{
return y + 1;
}

if(y | 0)
{
return ack(x - 1, ack(x, y - 1));
}
else
{
return ack(x - 1, 1);
}
}

integer fib(integer n)
{
if (n < 2)
{
return 1;
}
return fib(n - 2) + fib(n - 1);
}

float fibFP(float n)
{
if (n < 2.0)
{
return 1.0;
}
return fibFP(n - 2.0) + fibFP(n - 1.0);
}

integer tak(integer x, integer y, integer z)
{
if (y < x)
{
return tak(tak(x - 1, y, z), tak(y - 1, z, x), tak(z - 1, x, y));
}
return z;
}

float takFP(float x, float y, float z)
{
if (y < x)
{
return takFP( takFP(x-1.0, y, z), takFP(y-1.0, z, x), takFP(z-1.0, x, y) );
}
return z;
}

test()
{
integer n = 3;
llSay(0, "Ack(3," + (string)(n+1) + "): " + (string)(ack(3, n+1)));
//llSay(0, "Fib("+ (string)(28.0 + n) + "): " + (string)(fibFP(28.0+n)));

llSay(0, "Tak(" + (string)(3 * n) + "," + (string)(2 * n) + "," + (string)n + "): " + (string)tak(3*n, 2*n, n));

llSay(0, "Fib(3): " + (string)fib(3));
llSay(0, "Tak(3.0,2.0,1.0): " + (string)takFP(3.0, 2.0, 1.0));
}

time()
{
llResetTime();
llSay(0, "Starting tests...");
test();
llSay(0, "Finished tests in " + (string)llGetTime() + "s");

}

default
{
state_entry()
{
time();
}

touch_start(integer num)
{
time();
}
}
```