算法补天系列之——暴力递归

首先补充一下之前的迪杰斯特拉算法,也可以用堆的形式来实现,不过这个是肯定不能用系统提供的堆来实现的,因为这里有一个新发现的更小的路径,要修改堆的数据。
所以自己写堆的本领是必须要的,堆的底层结构是一个数组,然后最好我们设置一个node和数组位置的map、

暴力递归就是尝试

1.把问题转化为规模缩小了的同类问题的子问题
2.有明确的不需要继续进行递归的条件
3.有当得到了子问题的结果之后的决策过程
4.不记录每一个子问题的解
一定要学会怎么去尝试,因为这个是动态规划的基础

最最经典的就是汉诺塔问题了

三两个盘子的时候,我们靠人脑自己就可以想到个大概的走法
但是如果是n的盘子呢?
其实我们可以这样想,我们就是要把n-1个盘子挪到中间,把第n个盘子移动到右边,再把n-1个挪到右边。就可以了。(有没有一种大象装冰箱的感觉)
这个问题规模可以很大,但是实际上代码很简单。
这里如果一定都要从全局来理解的话,那其实是很难的,练递归看局部满足规则就可以了。

既然说到了汉诺塔,那我们又怎么能忘记了子序列问题呢?

这里我们需要注意的是,递归函数表示的是到了i位置,我们两种选择分别要怎么做,所以我们需要传递这两个选择实现之后的结果
这里其实我们也可以利用空间复用来实现,这样稍微节省一下空间,也就是递归中系统栈的保留机制的利用

说了子序列,我们再看看全排列吧

全排列要做的其实就是我们用一个字符串str存储我们之前做的选择

分支界限法,其实就是剪枝技巧,不改变时间复杂度,但是优化常数时间

有一些A*算法的感觉
绝顶聪明的选手来玩纸牌,就是自己这边能得到的和后手能选到的最好的情况

不申请额外的数据结构,只用递归函数来逆序一个栈
这道题就是一个考验递归技法的题目,讲真递归原来这么秀
充分的利用了递归函数的系统栈的功能,

1对应A,11对应K,这样循环往下的对换关系,给定一个数字,看我们最多有多少可能结果

这里我们需要把字符区分一下
0:不行,换不了
1-2:要纠结一下,可以单个换,也可以和后面的结合
3-9:省事了,直接换
之后确定终结情况:
○ 长度达标,走完了,返回1种
○ 这是走到0了,那不对,虽然前面有效,但是我这里换不了。
○ 走到1了,纠结一下,一个是自己单个走,如果后面还有,就是i,i+1一起作为一个部分来看后续。
○ 走到2了,比1多一个判断,因为26就到头了

既然动态规划就是暴力递归的一种,那我们是不是背包问题也可以做

0号要不要,1要不要直接一个个展开就可以
当然了,尝试的方式那是很多的
在这里插入图片描述

在这里插入图片描述

不过上面两个里面,第二个是最好的,因为他的可变参数形式简单数量少,因为只有这样才好改动态规划

那么我们再来看看n皇后问题看看怎么样?是不是也是一个标准的暴力递归方法呢?
是的。其实这个问题就是一个用来测试集群计算能力的问题了

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值