tb0667.pp 1.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889
  1. { %OPT=-Ootailrec }
  2. program tb0667;
  3. var
  4. stack: Pointer = Nil;
  5. function Test1(var Values: array of LongInt; Res: LongInt): LongInt;
  6. begin
  7. if not Assigned(stack) then
  8. stack := get_frame
  9. else if stack <> get_frame then
  10. Halt(1);
  11. if Length(Values) = 0 then
  12. Test1 := Res
  13. else
  14. Test1 := Test1(Values[0..High(Values) - 1], Res + Values[High(Values)]);
  15. end;
  16. function Test1(Values: array of LongInt): LongInt;
  17. begin
  18. Test1 := Test1(Values, 0);
  19. end;
  20. function Test2(constref Values: array of LongInt; Res: LongInt): LongInt;
  21. begin
  22. if not Assigned(stack) then
  23. stack := get_frame
  24. else if stack <> get_frame then
  25. Halt(3);
  26. if Length(Values) = 0 then
  27. Test2 := Res
  28. else
  29. Test2 := Test2(Values[0..High(Values) - 1], Res + Values[High(Values)]);
  30. end;
  31. function Test2(constref Values: array of LongInt): LongInt;
  32. begin
  33. Test2 := Test2(Values, 0);
  34. end;
  35. function Test3(const Values: array of LongInt; Res: LongInt): LongInt;
  36. begin
  37. if not Assigned(stack) then
  38. stack := get_frame
  39. else if stack <> get_frame then
  40. Halt(5);
  41. if Length(Values) = 0 then
  42. Test3 := Res
  43. else
  44. Test3 := Test3(Values[0..High(Values) - 1], Res + Values[High(Values)]);
  45. end;
  46. function Test3(const Values: array of LongInt): LongInt;
  47. begin
  48. Test3 := Test3(Values, 0);
  49. end;
  50. function Test4(Values: array of LongInt; Res: LongInt): LongInt;
  51. begin
  52. if not Assigned(stack) then
  53. stack := get_frame
  54. else if stack <> get_frame then
  55. Halt(7);
  56. if Length(Values) = 0 then
  57. Test4 := Res
  58. else
  59. Test4 := Test4(Values[0..High(Values) - 1], Res + Values[High(Values)]);
  60. end;
  61. function Test4(Values: array of LongInt): LongInt;
  62. begin
  63. Test4 := Test4(Values, 0);
  64. end;
  65. begin
  66. if Test1([1, 2, 3, 4]) <> 10 then
  67. Halt(2);
  68. stack := Nil;
  69. if Test2([1, 2, 3, 4]) <> 10 then
  70. Halt(4);
  71. stack := Nil;
  72. if Test3([1, 2, 3, 4]) <> 10 then
  73. Halt(6);
  74. stack := Nil;
  75. if Test4([1, 2, 3, 4]) <> 10 then
  76. Halt(8);
  77. writeln('ok');
  78. end.