How to avoid stack problems(记忆化出场)

1- If must do it in recursion, then avoid any unnecessary local data. Move to global as possible
2- Move to iterative procedure
3- Implement your own stack calls!

  1. // Fibonacci Series: Fib(n) = fib(n-1) + fib(n-2). Fib(0) = fib(1) = 1
  2. int fib(int n)
  3. {
  4. if(n <= 1)
  5. return 1;
  6. return fib(n-2) + fib(n-1);
  7. }
  8. // what is search space? n
  9. // what is number of recursive calls? We are branching every time to 2 levels that differs in 1
  10. // fib(5)
  11. // fib(4) fib(3)
  12. // fib(3) fib(2) fib(2) fib(1)
  13. // fib(2) fib(1) fib(1) fib(0) fib(1) fib(0)
  14. // fib(1) fib(1)
  15. //
  16. // We almost have 2^N calls
  17. // Wait, a space of N, is called 2^N times!
  18. // A fib of 50 do around ~1125899906842624 call!!!!!!
  19. //
  20. // Then, we must call a state more than once? and it too call other states, that already called!
  21. //
  22. // Check tree above, fib(3) called twice. Fib(2) called three times!
  23. //
  24. // Let's SAVE the answer, and let space of N is called 2N times!
  25. int savedAnswers[MAX]; /// Initialized to -1, means no answer
  26. int fibSave(int n)
  27. {
  28. if(n <= 1)
  29. return 1;
  30. if(savedAnswers[n] != -1)
  31. return savedAnswers[n];
  32. return savedAnswers[n] = fib(n-2) + fib(n-1);
  33. }
  34. // fib(5)=8
  35. // fib(4)=5 fib(3)=3
  36. // fib(3)=3 fib(2)=2
  37. // fib(2)=2 fib(1)=1
  38. // fib(1)=1 fib(1)=1

memoization记忆化

记忆化搜索,是在学习动态规划的时候,用到的。用记忆化搜索的方式,实现dp。在这个章节,练习题目时,也请感受一下记忆化操作。

  1. // 记忆化模板
  2. int g[MAXN]; // 定义记忆化数组
  3. int ans = 最坏情况, now;
  4. void dfs f(传入数值) {
  5. if (g[规模] != 无效数值) return; // 或记录解,视情况而定
  6. if (到达目的地) ans = 从当前解与已有解中选最优; // 输出解,视情况而定
  7. for (遍历所有可能性)
  8. if (可行) {
  9. 进行操作;
  10. dfs(缩小规模);
  11. 撤回操作;
  12. }
  13. }
  14. int main() {
  15. memset(g, 无效数值, sizeof(g)); // 初始化记忆化数组
  16. }