文章目录
动态规划与递归
(先来一点看的迷迷糊糊的理论)
01 递归和动态规划不同:
相同:都能分解成若干子问题
不同:DP(动态规划)存储子问题结果
02 动态规划的四要素:
1、状态(存储小规模问题的结果)
2、方程(状态之间的联系,怎么通过晓得状态,来算大的状态)
3、初始化(最极限的小状态是什么)
4、答案(最大的那个状态是什么)
动态规划问题:多用于解决多重叠子问题的问题。
前面的01/02反正我是觉得对时间用处不大。 下面开始说点人话:
人话分析
01 什么是递归
递归算法,将一个大问题拆解成很对小问题,通过解决这些小问题而最终解决大问题的方法。
在C++中实现递归算法,常使用递归函数,就是说使用调用自身的函数。
递归程序的基本特征:它调用自身(参数的值更小),具有终止条件,可以直接计算其结果。
02 使用递归地注意事项( 动态规划是开发高效的递归算法实现的基本技术)
在使用递归程序时,我们需要考虑编程环境必须能够保持一个其大小与递归深度成正比例的下推栈。对于大型问题,这个栈需要的空间会很大,可能会妨碍我们使用递归的方法。
一个递归模型为分治法,最本质的特征就是:把一个问题分解成独立的子问题。如果子问题并不独立,问题就会复杂的多,主要原因是即使是这种最简单算法的直接递归实现,也可能需要难以想象的时间,使用动态规划技术就可以避免这个缺陷。
03 举例 Fiboncci Number(斐波那契数)
001 重述一下题目:
1,1,2,3,5,8,13…第n个数字等于n-1和n-2之和。这样一列数叫做斐波那契数
函数的作用就是求第n个数字的值。
002 递归自顶向下
众所周知第n个数字等于n-1和n-2之和,当n=1or2时 ,第n个裴波那契数都是1.
因此终止条件就是n== 1or n==2, 递归函数就是 F(n)=F(n-1)+F