1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465 |
- (* The Computer Language Benchmarks Game
- http://shootout.alioth.debian.org/
- contributed by Josh Goldfoot
- modified by Vincent Snijders
- *)
- program recursive;
- {$mode objfpc}{$I-}{$OPTIMIZATION TAILREC}
- var
- n : longint;
- function Ack(x : longint; y : longint): longint;
- begin
- if x = 0 then
- Ack := y + 1
- else if y = 0 then
- Ack := Ack(x - 1, 1)
- else Ack := Ack(x-1, Ack(x, y-1));
- end; { Ack }
- function Fib(n : longint): longint;
- begin
- if n < 2 then
- Fib := 1
- else Fib := Fib(n - 2) + Fib(n - 1)
- end; { Fib }
- function FibFP(n : double): double; inline;
- begin
- if n < 2 then
- FibFP := 1
- else FibFP := FibFP(n - 2) + FibFP(n - 1)
- end; { FibFP }
- function Tak(x : longint; y: longint; z : longint): longint;
- begin
- if y < x then
- Tak := Tak( Tak(x-1, y, z), Tak(y-1, z, x), Tak(z-1, x, y) )
- else Tak := z;
- end; { Tak }
- function TakFP(x : double; y: double; z : double): double;
- begin
- if y < x then
- TakFP := TakFP( TakFP(x-1, y, z), TakFP(y-1, z, x), TakFP(z-1, x, y) )
- else TakFP := z;
- end; { TakFP }
- begin
- if ParamCount = 1 then begin
- Val(ParamStr(1), n);
- n := n - 1;
- end
- else n := 2;
- writeLn('Ack(3,', n + 1, '): ', Ack(3, n+1));
- writeLn('Fib(', (28.0 + n):1:1, '): ', FibFP(28.0 + n):1:1);
- writeLn('Tak(', 3 * n,',', 2 * n, ',', n, '): ', Tak(3*n, 2*n, n));
- writeLn('Fib(3): ', Fib(3));
- writeLn('Tak(3.0,2.0,1.0): ', TakFP(3.0,2.0,1.0):1:1);
- end.
|