fork download
  1. #include <iostream>
  2. #include <stack>
  3. using namespace std;
  4.  
  5. // Original recursive function
  6. int F(int n) {
  7. { // Block 0 - initial setup and base cases
  8. if (n <= 0) return 0;
  9. if (n == 1) return 1;
  10. }
  11.  
  12. int x;
  13. { // Block 1 - first recursive call (n-3)
  14. x = F(n - 3);
  15. }
  16.  
  17. int y;
  18. { // Block 2 - second recursive call (n/2)
  19. y = F(n / 2);
  20. }
  21.  
  22. int z;
  23. { // Block 3 - calculation
  24. z = x * y;
  25. }
  26.  
  27. { // Block 4 - final result
  28. return n + z;
  29. }
  30. }
  31.  
  32. struct ActivationRecord {
  33. int n;
  34. int x, y, z; // Local variables
  35. int block_num; // Current block being executed
  36. int return_value;
  37.  
  38. ActivationRecord(int n) : n(n), block_num(0), x(0), y(0), z(0) {}
  39. };
  40.  
  41. int G(int n) {
  42. stack<ActivationRecord> call_stack;
  43. call_stack.push(ActivationRecord(n));
  44. int final_result = 0;
  45.  
  46. while (!call_stack.empty()) {
  47. ActivationRecord& ar = call_stack.top();
  48.  
  49. switch (ar.block_num) {
  50. case 0: { // Block 0 - base cases check
  51. if (ar.n <= 0) {
  52. ar.return_value = 0;
  53.  
  54. final_result = ar.return_value;
  55. call_stack.pop();
  56. }
  57. else if (ar.n == 1) {
  58. ar.return_value = 1;
  59. final_result = ar.return_value;
  60. call_stack.pop();
  61. }
  62. else {
  63. ar.block_num = 1; // Move to next block
  64. }
  65. break;
  66. }
  67.  
  68. case 1: { // Block 1 - first recursive call (n-3)
  69. call_stack.push(ActivationRecord(ar.n - 3));
  70. ar.block_num = 2; // After this returns, go to block 2
  71. break;
  72. }
  73.  
  74. case 2: { // Block 2 - store x and make second call
  75. ar.x = final_result; // Result from previous call
  76. call_stack.push(ActivationRecord(ar.n / 2));
  77. ar.block_num = 3; // After this returns, go to block 3
  78. break;
  79. }
  80.  
  81. case 3: { // Block 3 - store y and calculate z
  82. ar.y = final_result; // Result from previous call
  83. ar.z = ar.x * ar.y;
  84. ar.block_num = 4; // Move to final block
  85. break;
  86. }
  87.  
  88. case 4: { // Block 4 - final calculation
  89. ar.return_value = ar.n + ar.z;
  90. final_result = ar.return_value;
  91. call_stack.pop();
  92. break;
  93. }
  94. }
  95. }
  96.  
  97. return final_result;
  98. }
  99.  
  100. int main() {
  101. cout << "Testing recursive F() vs iterative G():" << endl;
  102. for (int i = 0; i <= 10; i++) {
  103. cout << "F(" << i << ") = " << F(i) << " | G(" << i << ") = " << G(i) << endl;
  104. }
  105. return 0;
  106. }
Success #stdin #stdout 0.01s 5288KB
stdin
Standard input is empty
stdout
Testing recursive F() vs iterative G():
F(0) = 0  |  G(0) = 0
F(1) = 1  |  G(1) = 1
F(2) = 2  |  G(2) = 2
F(3) = 3  |  G(3) = 3
F(4) = 6  |  G(4) = 6
F(5) = 9  |  G(5) = 9
F(6) = 15  |  G(6) = 15
F(7) = 25  |  G(7) = 25
F(8) = 62  |  G(8) = 62
F(9) = 99  |  G(9) = 99
F(10) = 235  |  G(10) = 235