是自下而上动态规划递归?

问题描述:

在这种方法中,计算较小的子问题并缓存结果,然后计算较大的子问题,为此我们使用缓存早期计算值的表中已计算的较小子问题的优化值。那么,这种方法是递归的还是迭代的?是自下而上动态规划递归?

+1

也没有。 DP只是一种算法技术;它并不意味着实际的实现。逻辑是递归的(通过解决缩小的相同问题来解决更大的问题),如果这就是你的意思? – Paul

我们在动态规划中使用的方法实际上是inductive。可以将建设性归纳证明转换为递归算法或迭代算法。这只是品味的问题。例如。 memoization是一个递归实现,而对于每个memoized算法都有一个迭代的方法。

简单的例子是斐波纳契数。我们可以把它写迭代:

Fib (n) 
{ 
    F_1=F_2=1; 
    For i =3..n 
     F_i = F_i-1 + F_i-2; 
    Return F_n; 
} 

一个可以递归写:

Define array F of size n; 
    F [1]=F [2]=1; 
    Fib (n) 
    { 
     If (F [n-1]==0) 
      F [n-1] = Fib (n-1); 

     If (F [n-2]==0) 
      F [n-2] = Fib (n-2); 
    F [n]= F[n-2]+F [n-1]; 
    Return F[n]; 
    } 

他们两个都是动态编程和他们有相同的顺序。在某些情况下,递归更容易。在某些情况下,迭代速度更快。

+0

我认为这是一个很好的解释。还有一点:有些编程语言不直接支持递归调用,所以直接的递归实现是不可能的。此外,显然大多数人认为各自的归纳公式表现出对问题的“更好理解”。我听说了“评估顺序”很重要的论点,因为“首先需要评估基础值” - 然而,递归实现中也是如此。 – Codor

+0

我不只是在谈论动态规划,而是专门讨论它的两种方法之一:自下而上的方法。为什么我认为自下而上的方法具有迭代性(而不是递归),还有递归的另一个特点:我们从要解决的主要问题开始,在每次递归之后,我们向基础条件移动一步。但是,如果采用这种自下而上的方法,我们将从基础条件开始,缓存结果并使用它们来评估即将到来的结果。那么它不是递归的而是迭代的? – Deba

+0

@Deba,正如我所说,它基本上是归纳性的。可以通过递归方法来处理归纳:通过将其大小减小到基本情况来解决最大的情况,这里基本情况是归纳的小实例或基本情况。另一个可以自下而上的方法:基本解决问题,我们知道如何解决更大的实例,解决更大的实例。所以在这种情况下,递归和自下而上的方法只是实现归纳的工具。也许更自然的说它是自下而上的,但这只是品味的问题。 –