Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 递归与动态规划_Algorithm_Recursion_Dynamic Programming - Fatal编程技术网

Algorithm 递归与动态规划

Algorithm 递归与动态规划,algorithm,recursion,dynamic-programming,Algorithm,Recursion,Dynamic Programming,我知道,每一个可以用动态规划来解决的程序都可以用递归来解决,但是反过来也可以吗?如果可能,那么时间复杂度会有什么不同?动态规划是一种时间与复杂度的折衷。您将一些信息存储在表中,因此如果需要再次执行相同的操作,则无需重新计算这些信息 如果您的问题自然分解为经常重复的子问题,那么动态规划是一个好主意。另一方面,如果没有重复出现的子问题,那么使用动态规划就没有意义 反之亦然吗 对 另一方面,如果你真的想问: 反之亦然吗 合理地说,答案是否定的。不是所有可以用递归算法解决的问题都可以用动态规划合理地解决

我知道,每一个可以用动态规划来解决的程序都可以用递归来解决,但是反过来也可以吗?如果可能,那么时间复杂度会有什么不同?

动态规划是一种时间与复杂度的折衷。您将一些信息存储在表中,因此如果需要再次执行相同的操作,则无需重新计算这些信息

如果您的问题自然分解为经常重复的子问题,那么动态规划是一个好主意。另一方面,如果没有重复出现的子问题,那么使用动态规划就没有意义

反之亦然吗

另一方面,如果你真的想问:

反之亦然吗

合理地说,答案是否定的。不是所有可以用递归算法解决的问题都可以用动态规划合理地解决。我们只需要提出一个问题来强调这一点:排序。用递归算法解决排序问题很容易,但用动态规划解决排序问题似乎没有一个合理的算法。不幸的是,我不得不在这里使用“合理”这个词,因为你可以以某种方式强制使用动态规划来解决排序问题,这是一种非常笨拙和低效的方式


关于时间复杂性的问题无法回答。这取决于手头的问题,以及动态规划在解决问题时的适用性。

如果一个问题(1)具有最优子结构,即递归,并且(2)具有重叠的子问题,则可以使用动态规划解决该问题。因此,任何没有重叠子问题的递归问题都不能用动态规划来解决。例如:插入排序,如果递归定义为排序列表[0:n]=排序列表[0]+排序列表[1:n]。

实际上并没有回答这个问题。这个问题和是否或何时“使用动态规划毫无意义”无关。这是一个理论问题,关于一个通过递归可以解决的问题是否意味着它也可以通过动态规划来解决。动态规划是否适用于一般递归问题取决于在计算过程中是否需要重新计算任何子问题。如果没有重复的子状态,那么动态编程就没有好处。除非你说“使用动态编程解决程序”对你意味着什么,否则就无法真正回答这个问题。一般来说,这不是一个精确定义的东西。例如,对于一个使用动态规划对数组进行排序的程序来说,这意味着什么?我通常会问它,就像打印字符串的排列一样,可以使用递归来完成。如果我们想找到一个字符串的排列,它可以用递归来计算,那么它可以用动态规划来完成吗。同一个问题可以用动态规划来解决吗?一个问题必须有两个关键属性,动态规划才能在解决问题时发挥作用:重叠子问题和最优子结构。组合生成问题(寻找字符串排列)有这两个关键性质吗?它没有重叠的子问题。这意味着它不能用动态规划来解决吗?@Xylene23正如我在回答中所解释的,我不能说“它不能用DP来解决”,因为可能存在一种解决组合生成的DP算法。这可能完全没有必要,但这并不意味着这是不可能的。