反例证明动态编程中的记忆并不总是有用

时间:2018-05-03 16:20:51

标签: recursion dynamic-programming memoization

这是我上个月课堂测试的一部分,从那以后我花了一些时间阅读DP中的Memoization及其对后者的影响。我能够找到并彻底理解它被证明富有成效的案例,但是因为DP从根本上将这种方法用于 " store" 子问题以供以后使用,这不会使问题变得有点错误,因为我们总会对现有解决方案进行某种缓存以供将来使用吗?

如果我弄错了,请纠正我。

1 个答案:

答案 0 :(得分:0)

没有!在每种情况下,记忆都没有帮助。一个简单的反例可以想到的是factorial(n)函数,您需要计算给定数字n的阶乘。

factorial(n): if(n = 1) return; else return n*factorial(n-1);
考虑上面的伪代码来计算给定数字n的阶乘。比如说,n = 5,函数将像这样计算factorial(5)

  • 5 * factorial(4)
  • 4 * factorial(3)
  • 3 * factorial(2)
  • 2 * factorial(1)
  • 1 * factorial(0)
  • 1

如您所见,每次从函数返回一个新值并且每次存储时,该值都没有意义,因为后续的递归调用将无法从中受益。

在这些情况下,我们会采用另一种方法,我们将其称为制表