Recursion 递归可以是动态规划吗?

Recursion 递归可以是动态规划吗?,recursion,dynamic-programming,fibonacci,Recursion,Dynamic Programming,Fibonacci,我被要求使用动态规划来解决一个问题。关于什么是动态规划,我有不同的看法。我认为这需要一种“自下而上”的方法,即首先解决最小的问题 有一件事我有矛盾的信息,那就是如果同一个子问题被多次解决,是否可以是动态规划,就像递归中经常出现的情况一样 比如说。对于斐波那契,我可以有一个递归算法: RecursiveFibonacci(n) if (n=1 or n=2) return 1 else return RecursiveFibonacci(n-1) + RecursiveFibona

我被要求使用动态规划来解决一个问题。关于什么是动态规划,我有不同的看法。我认为这需要一种“自下而上”的方法,即首先解决最小的问题

有一件事我有矛盾的信息,那就是如果同一个子问题被多次解决,是否可以是动态规划,就像递归中经常出现的情况一样

比如说。对于斐波那契,我可以有一个递归算法:

RecursiveFibonacci(n)
if (n=1 or n=2)
    return 1
else
    return RecursiveFibonacci(n-1) + RecursiveFibonacci(n-2)
在这种情况下,相同的子问题可能会被反复解决。这是否表明它不是动态规划?也就是说,如果我想要动态规划,我是否必须避免解决子问题,例如使用长度为n的数组并存储每个子问题的解决方案(数组的第一个索引是1、1、2、3、5、8、13、21)


动态程序通常可以用递归公式简洁地描述

但是,如果你用简单的递归计算机程序来实现它们,这些程序往往效率低下,原因正是你提出的:重复同样的计算。斐波那契是一个重复计算的例子,尽管它不是一个动态程序

有两种方法可以避免重复

  • 回忆录。这里的想法是将为每组参数计算的答案缓存到递归函数中,并在存在时返回缓存的值

  • 自下而上的桌子。在这里,您可以“展开”递归,以便将级别小于i的结果与级别i的结果相结合。这通常被描述为填写表格,其中级别为行

  • 这些方法之一适用于任何DP算法。如果重复计算,则该算法不是DP。因此,您的问题的答案是“是”。

    举个例子。。。让我们尝试一下,如果你有价值v_1,v_2。。。v_n,使用最少数量的硬币

    设N(c)为制造c美分所需的最小硬币数。然后给出了一个递归公式

    N(c) = 1 + min_{i = 1..n} N(c - v_i) 
    

    基本情况是N(0)=0和N(k)=inf,对于k我们认为一个问题的动态规划方法是可行的

  • 重叠子问题
  • 最优子结构
  • 简单地说,我们可以说动态规划有两个方面,它们是自顶向下和自下而上的方法

    在您的例子中,如果您谈论的是递归,那么这是一种自上而下的方法。
    在自上而下的方法中,我们将尝试编写一个递归解决方案或蛮力解决方案并记忆结果,以便在出现类似子问题时尝试使用该结果,因此它是蛮力+记忆化。我们可以通过一个简单的递归关系实现暴力方法。

    谢谢Gene。因此,为了澄清定义(这就是我真正想要的:o)),即使使用递归算法,同样的问题可能会一次又一次地被解决,这是低效的,它仍然算作动态规划吗,仅仅因为较大的问题首先被分解成较小的问题?@user2808302不。我从来没有见过这样的术语。动态程序或DP算法的基本假设是,子问题只需求解一次即可得到较大的问题解。当用递归公式描述它时,意味着记忆化或自底向上的表构造。
    N(c) = 1 + min_{i = 1..n} N(c - v_i)