Recursion 反例证明动态规划中的记忆并不总是有用的

Recursion 反例证明动态规划中的记忆并不总是有用的,recursion,dynamic-programming,memoization,Recursion,Dynamic Programming,Memoization,这是我上个月课堂考试的一部分,从那以后,我花了一些时间阅读DP中的回忆录及其对后者的影响。我能够找到并彻底理解证明有效的案例,但是由于DP从根本上采取了这种方法来存储子问题,以备将来使用,这难道不会让问题变得有点错误,因为现在的解决方案总是有某种缓存供将来使用吗 如果我弄错了什么,请纠正我。不!记忆并不是在所有情况下都有用。我们可以想到的一个简单的反例是factorial(n)函数,其中需要计算给定数字的阶乘n。 factorial(n): 如果(n=1)返回; 否则返回n*阶乘(n-1);

这是我上个月课堂考试的一部分,从那以后,我花了一些时间阅读DP中的回忆录及其对后者的影响。我能够找到并彻底理解证明有效的案例,但是由于DP从根本上采取了这种方法来存储子问题,以备将来使用,这难道不会让问题变得有点错误,因为现在的解决方案总是有某种缓存供将来使用吗


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

不!记忆并不是在所有情况下都有用。我们可以想到的一个简单的反例是
factorial(n)
函数,其中需要计算给定数字的阶乘
n

factorial(n):
如果(n=1)返回;
否则返回n*阶乘(n-1);

考虑上面的伪代码来计算给定数的阶乘<代码> n< /代码>。假设n=5,函数将计算阶乘(5),如下所示:

  • 5*
    factorial(4)
  • 4*
    factorial(3)
  • 3*
    factorial(2)
  • 2*
    factorial(1)
  • 1*
    factorial(0)
  • 一,
如您所见,每次从函数返回一个新值并每次存储该值都没有意义,因为后续递归调用将无法从中受益


在这种情况下,我们采用另一种方法,我们称之为制表

,我想你也可以通过记忆来计算阶乘。请参考:因此,通过递归树找出原因在一定程度上有助于理解这一点,并解释为什么在这种情况下,与通过记忆计算斐波那契数列等其他情况相比,记忆从未真正起到作用。相关: