1、把问题转化为规模缩小了的同類问题的子问题
2、有明确的不需要继续进行递归怎么用的终止条件
3、有当得到了子问题的结果之后的决策过程
4、不需要记录每一个子问题嘚解
2、将每一个子问题的解记录下来避免重复计算(这是动态规划优于递归怎么用的本质原因)
3、把暴力递归怎么用的过程,抽象成了狀态表达
4、并且存在化简状态表达使其更加简洁的可能
打印一个字符串的全部子序列包括空字符串
例如abc的全部子序列为a,b,c,ab,bc,ac,abc和空字符串(注意子序列和子串的区别,子序列可以不连续子串必须连续,前者去掉ac就是子串)
暴力递归怎么用思路:还是以abc为例
对于每个位置,都有要和不要两种选择穷尽所有位置即可得到***,如下图
运行结果(第一行是涳串):
给你一个二维数组数组中的每一个数都是正数,要求从左上角走到右下角每一步只能向右或者向下,沿途经过的数字要累加起来返回最小的路径和。
分析一下暴力递归怎么用的思路:
情况(1):当前点(i,j)来到最后一列此时只能向下走,即走到(i+1j)
情况(2):当前点(i,j)来到最後一行此时只能向右走,即走到(ij+1)
情况(3):普遍情况,当前点可以选择向右或者向下选择其中路径和较小的一个
有了思路,代碼不一会儿就刷刷刷的写好了
运行一下果然没错哈哈哈!!!!!
这里要注意,不是所有嘚暴力递归怎么用问题都能改成动态规划需要两个条件
(1)暴力递归怎么用问题存在大量重复计算
重复计算很容易理解,以这道题为例
3位置要计算0位置和5位置
2位置要计算7位置和5位置
也就是说5位置及其之后所有位置都有存在着无用的重复计算,这是暴力递归怎么用递归怎麼用效率不行的本质原因
(2)该问题属于**“无后效性”问题**
所谓无后效性问题是指不管经过什么方法到达当前位置,当前位置到其所要箌的位置的值是固定的不受之前方法的影响。以这道题为例::
若当前位置是5位置那么它可能是1->3->5或者1->2->5,但不管是从那一条路到达5位置的,5位置到右下角的最小路径和是固定不变的始终等于5+1+2=8。
很显然这道题可以改成动态规划分析一下思路:
终于写完了…。mdzz明明保存了草稿,打开发现不见了所以又得手撸一遍。。难受
学过数学的可能多多少少听过“遞归怎么用”这个词
那么递归怎么用函数到底是怎么个函数呢
老样子,从需求找方法!
我想要 100/2 结果继续除2直到结果为零,然后打印每┅步的结果
怎么写呢可以用循环!对!
要的就是这种结果!但是,总有艮的
就想用函数来解决这个问题
甚至更过分的!还不想用循环!
能做吗于是就有大傻子科学家研究出另一种写法:
发现,n 这个变量就变成 50 了然后还是要执行这个函数
也就是说,我可能要多次调用这個函数!
所以就有了接下来的想法:
成功了!那光成功不行啊,咱们得研究研究怎么做到的呢?
有感觉出循环了吗?通过不断的自峩调用达到了目的
每一次的函数的输出都是基于上次的返回结果!
这不,有人写了这个代码!
和上面的比就多了一句话(找不到?捐眼睛吧)
你试试结果是什么和你想的一样吗?
不是你想得100 也不是你想的1或者0吧!
那到底为什么呢??
以我现在的能力我只能这麼给你解释
要是不明白的话确实是我能力不足
还请大佬在下面评论一下,多谢!
所以输出就是那个鬼样子!
每次进入更深一层的遞归怎么用的时候,问题规模就会减少
递归怎么用效率不高容易栈溢出(别问,问就自己百度)