自下而上动态编程是递归的吗?

时间:2017-01-10 20:34:59

标签: algorithm dynamic-programming bottom-up topdown

在这种方法中,计算较小的子问题并缓存结果,然后我们计算较大的子问题,我们使用已经计算的较小子问题的优化值来缓存先前计算的值。那么,这种方法是递归还是迭代?

1 个答案:

答案 0 :(得分:2)

我们在动态编程中使用的approch实际上是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];
  }

它们都是动态编程,并且它们具有相同的顺序。在某些情况下,递归编写更容易。在某些情况下,迭代更快。