1看到介绍递归比较好的文章,链接如下:
https://blog.csdn.net/sinat_38052999/article/details/73303111
参考自:https://www.docin.com/p-1126738649.html和左程云算法
递归和动态规划的一个区别(递归是自顶向下,然后返回计算;动态规划是自低向上运算)
典型举例:佩波纳契数列
递归方式的时候,这里存在重复计算:比如需要f(5)
f(5)=f(4)+f(3)
f(4)=f(3)+f(2)
f(3)=f(2)+f(1)
然后返回去计算出结果,
题目已知f(1)=1,f(2)=1.那么根据上边f(3)=f(1)+f(2)=2.
同理:f(4)=f(3)+f(2)=[f(1)+f(2)]+f(2)=3
f(5)=f(4)+f(3)=[f(3)+f(2)]+[f(2)+f(1)]={[f(1)+f(2)]+f(2)}+[f(2)+f(1)]=5
这里就重复计算了f(3)和f(4)。
动态规划方式的区别,比如需要f(4),首先找一个数组或者变量。这里使用一个变量。temp
我们已知f(1)=1,f(2)=2.那么根据定义:f(3)=f(1)+f(2)=2,
使用一个temp记录下这个f(3)值。
计算f(4)=f(3)+f(2)=temp+f(2)=3.
这里为什么需要记录f(3)的值,不用记录f(1)和f(2),——————题目已知f(1)=1,f(2)=2.如果没有记录f(3),那么只是计算了,但是结果没有保存。入果还要计算f(5),就需要记录f(4)和f(3)的结果。
实际上就是用空间换取时间。
1.递归方式:
复杂度:
这里存在重复计算:比如需要f(4)
f(4)=f(3)+f(2)
f(3)=f(2)+f(1)
然后返回去计算出结果,这里就重复利用了f(2)。
2.动态规划算法:
自底向上:
时间复杂度是n
改进一点:以下方式只是算出第n项,同时每次只是记忆前面两项。空间比上面方式更省。
3.总结:递归结构更容易理解,动态规划加入了记录表,相当于是利用空间换时间的做法。