您的位置:首页 > 其它

动态规划

2017-06-09 17:15 134 查看

1、递归与动态规划

我记得第一个递归方法是求n的阶乘:

"""
return n's factorial
"""
def fact(n):
if n <=1:
return 1
return n*fact(n-1)


再写一个求fabnaci数列中第n个位置的值的函数,也用递归:

def fabnaci(n):
if n <= 1:
return 1
return fabnaci(n-1) + fabnaci(n-2)


这两个函数看似相似,但是是有区别的,以
n=5
为例:



图中左侧是fabnaci的计算过程,右侧是阶乘的计算过程。

它们的相似之处是:将原问题分解成一个或多个规模较小而结构与原问题相似的子问题;递归地解决这些子问题,然后再合并其结果,就得到原问题的解。

不同之处是:fabnaci的子问题有重复的,而阶乘子问题没有重复的。

那fabnaci的计算效率就很低了,如果把计算过的结果存储起来,下次用到直接查询,这样就可以避免重复计算了。

参考:http://blog.csdn.net/deepit/article/details/6530282

2、穷举与动态规划



如上图所示,我们要从开始到结束选择一条路径,如:A1→B2→C1→D1。A,B,C,D四个模块,每个模块有两个选择,如果用穷举法的话一共有24中选择。

我们可以从另一个角度考虑问题:到A1的最短路径,只有一种选择;到B1的最短路径,要么从A1出发,并且是经过到A1的最短路径,要么从A2出发,并且是经过到A2的最短路径。我们可以先计算到A1、A2的最短路径,再计算到B1、B2的最短路径,再计算到C1、C2,再计算到D1、D2的最短路径,最后计算到终点的最短路径。这样计算量就只有2∗4。

一个问题的最优解包含了子问题的一个最优解,这个性质叫做最优子结构

动态规划算法的设计可以分为如下4个步骤

1)描述最优解的结构。

2)递归地定义最优解的值。

3)按自底向上的方式计算最优解的值。

4)由计算出的结果构造一个最优解。

3、递归和循环

递归是在函数中调用自己,也就是原问题可以通过结构相似、规模更小的子问题解决,而且递归必须有个出口。

我觉得递归问题都可以转化为循环。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  动态规划 递归 算法