若一个算法直接的或间接的调用自己本身,则称这个算法是递归算法。递归本质上也是一种循环的算法结构,它把较复杂的计算逐次归结为较简单的情形的计算,直到归结到最简单情形的计算,并最终得到计算结果为止。利用递归算法解决的问题通常具有如下3个特性:
1)求解规模为n的问题可以转化为一个或多个结构相同、规模较小的问题,然后从这些小问题的解能方便地构造出大问题的解。
2)递归调用的次数必须是有限的。
3)必须有结束递归的条件(边界条件)来终止递归。
①明确你这个函数想要干什么。先不管函数里面的代码什么,而是要先明白,你这个函数的功能是什么,要完成什么样的一件事。
②寻找递归结束条件。我们需要找出当参数为啥时,递归结束,之后直接把结果返回,请注意,这个时候我们必须能根据这个参数的值,能够直接知道函数的结果是什么。
③找出函数的等价关系式。我们要不断缩小参数的范围,缩小之后,我们可以通过一些辅助的变量或者操作,使原函数的结果不变。
--------------------------------------------------------------------------------------------------------------------------------------
分治策略是对于一个规模为n的问题,将其分解为k个规模较小的子问题,这些子问题互相独立且与原问题形式相同,递归地解这些子问题,然后将各子问题的解合并得到原问题的解。
这里要注意,不可把分治策略和递归算法混为一谈,二者之间根本没有什么可比较的。分治策略是一种算法思想,递归则是一种算法的实现方法,完全可以把递归当做是一种循环形式。
①分解,将原问题分解为若干个规模较小,相互独立,与原问题形式相同的子问题。
②解决,若子问题规模较小而容易被解决则直接解,否则递归或迭代地解各个子问题。
③合并,将各个子问题的解合并为原问题的解。
--------------------------------------------------------------------------------------------------------------------------------------
动态规划算法是多阶段决策过程,每步求解的问题是后面阶段求解问题的子问题。
动态规划任何一个i+1阶段都仅仅依赖 i 阶段做出的选择。而与i之前的选择无关。但是动态规划不仅求出了当前状态最优值,而且同时求出了到中间状态的最优值。具体的动态规划算法多种多样,但它们具有相同的填表格式。
动态规划问题的三个性质:
1)最优子结构性质
当问题的最优解包含了子问题的最优解时,称该问题具有最优子问题结构。在动态规划算法中,利用问题的最优子结构性质,以自底向上的方式递推地从子问题的最优解逐步构造出整个问题的最优解。
2)重叠子问题性质
在用递归算法解决问题时,每次产生的子问题并不总是新问题,有些子问题可能被反复计算多次。动态规划算法将子问题结果保存在一个表格中,当再次需要解此子问题时,只需要简单地查看一下结果即可。通常使用递归解决动态规划的问题成为备忘录法,该方法使用较少。
3)无后效性
某阶段的状态一旦确定,就不受这个状态之后的决策影响。
①找出最优解的性质,并刻划其结构特征(建立数学模型来描述问题,根据边界情况确定初值)。
②递归地定义最优值(给出状态转移方程,把问题方程化)。
③以自底向上的方式计算出最优值(根据状态转移方程不断填表)。
④根据计算最优值时得到的信息,构造最优解(由表中信息得到最优解)。
--------------------------------------------------------------------------------------------------------------------------------------
动态规划算法通常以自底向上的方式解各子问题,而贪心算法则通常以自顶向下的方式进行,以迭代的方式作出相继的贪心选择,每作一次贪心选择就将所求问题简化为规模更小的子问题。
根据当前状态做出的当前看来是最好的选择,即局部最优解选择,然后再去解做出这个选择后产生的相应的子问题。每做一次贪心选择就将所求问题简化为一个规模更小的子问题,最终可得到问题的一个整体最优解。这种局部最优选择并不总能获得整体最优解,但通常能获得近似最优解。
利用贪心法求解的问题应具备如下2个特征 :
1)贪心选择性质
一个问题的整体最优解可通过一系列局部的最优解的选择达到,并且每次的选择可以依赖以前作出的选择,但不依赖于后面要作出的选择。这就是贪心选择性质。对于一个具体问题,要确定它是否具有贪心选择性质,必须证明每一步所作的贪心选择最终导致问题的整体最优解() 。
2)最优子结构性质
当一个问题的最优解包含其子问题的最优解时,称此问题具有最优子结构性质。可用证明该性质。
①建立数学模型来描述问题 。
②证明问题具有贪心选择性质和最优子结构性质。
③制定贪心选择策略,不断得到局部最优解的同时简化问题规模 。
④把子问题的局部最优解合成原来问题的解 。