recursive.pp 1.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465
  1. (* The Computer Language Benchmarks Game
  2. http://shootout.alioth.debian.org/
  3. contributed by Josh Goldfoot
  4. modified by Vincent Snijders
  5. *)
  6. program recursive;
  7. {$mode objfpc}{$I-}{$OPTIMIZATION TAILREC}
  8. var
  9. n : longint;
  10. function Ack(x : longint; y : longint): longint;
  11. begin
  12. if x = 0 then
  13. Ack := y + 1
  14. else if y = 0 then
  15. Ack := Ack(x - 1, 1)
  16. else Ack := Ack(x-1, Ack(x, y-1));
  17. end; { Ack }
  18. function Fib(n : longint): longint;
  19. begin
  20. if n < 2 then
  21. Fib := 1
  22. else Fib := Fib(n - 2) + Fib(n - 1)
  23. end; { Fib }
  24. function FibFP(n : double): double; inline;
  25. begin
  26. if n < 2 then
  27. FibFP := 1
  28. else FibFP := FibFP(n - 2) + FibFP(n - 1)
  29. end; { FibFP }
  30. function Tak(x : longint; y: longint; z : longint): longint;
  31. begin
  32. if y < x then
  33. Tak := Tak( Tak(x-1, y, z), Tak(y-1, z, x), Tak(z-1, x, y) )
  34. else Tak := z;
  35. end; { Tak }
  36. function TakFP(x : double; y: double; z : double): double;
  37. begin
  38. if y < x then
  39. TakFP := TakFP( TakFP(x-1, y, z), TakFP(y-1, z, x), TakFP(z-1, x, y) )
  40. else TakFP := z;
  41. end; { TakFP }
  42. begin
  43. if ParamCount = 1 then begin
  44. Val(ParamStr(1), n);
  45. n := n - 1;
  46. end
  47. else n := 2;
  48. writeLn('Ack(3,', n + 1, '): ', Ack(3, n+1));
  49. writeLn('Fib(', (28.0 + n):1:1, '): ', FibFP(28.0 + n):1:1);
  50. writeLn('Tak(', 3 * n,',', 2 * n, ',', n, '): ', Tak(3*n, 2*n, n));
  51. writeLn('Fib(3): ', Fib(3));
  52. writeLn('Tak(3.0,2.0,1.0): ', TakFP(3.0,2.0,1.0):1:1);
  53. end.