1. 问题描述:

我们在使用深度优先算法的时候往往要往递归的方法中传入多个参数,但是怎么样将需要的参数传递进去呢?

2. 思路分析:

① 首先这个我们根据实际问题来进行分析,在递归方法的时候首先应该把必须要的参数传进去,在写的时候发现往下继续调用或者其他操作的时候假如不能够进行完成那么需要考虑多传进去一个我们需要的参数,这样可能对问题的求解救比较容易了

② 传进递归方法的参数无非就是由两种,一种是引用类型的变量或者数据结构,在递归方法的主体部分中我们可能需要借助于这些变量或者数据结构来对其进行操作,有可能操作之后我们改变了这些变量或者数据结构的内容,也有可能不改变,因为有的时候我们只需要取出数组或者List<String>中的元素的值而不改变其中的内容,而有的时候将会改变其中的内容

所以我们可能改变其中的内容,因为我们需要记录在递归过程中的中间过程,例如牌型种类的题目中我们使用List<String>记录中间过程中取到的牌的种类是什么,每一次取了牌,那么这个集合都是改变的,等到调用完回到这一层我们可以清除掉之前调用这一层之前假如的那个元素(回溯),记录的原因是因为我们需要看一下之前我们取出来的某些牌是否等于了四张,假如等于了四张那么我们就不能够再取这种牌了,在全排列的例子中我们使用交换元素的方法也是改变了数组元素中的内容,这些都是改变了数组内容或者List集合元素中的内容的

另外一类是记录当前状态下某些变量的值,每一次的调用这些值都是变化的,而且这些变量是往问题解决的那个方向去逼近的,每一次的调用问题规模都在一步步地缩小从而最终到达递归的出口

这个是要根据实际的问题具体分析可以确定的,可以是字符串的长度,可以是某个数组的长度等等,等到它到达某个值的是那么它就碰到了递归的出口可以进行相关的操作然后return了

③ 还有的情况下由于题目的限制条件我们需要记录下我们当前状态下的某个变量的值或者当前状态下对下一个状态有影响的值,例如在地宫取宝的过程中,由于需要知道当前状态下我手中的最大物品的价值是什么,所以每一次往下进行调用的时候我都需要记录当前状态下的最大值,这样进入下一层的调用的时候我就知道了我上一次中物品的最大价值这样我就可以比较手中的最大价值与格子中物品的价值的大小关系,所以来说传入的上一个状态的变量对下一个状态是有限制的

类似于这种情况的我们还有垒骰子这个例子,我们知道限制条件是假如对立面有互斥的情况我们是不能够垒的,所以每一次的时候我都需要记录下当前层的垒的最底面的那个数字是什么然后把这个变量传到下一层,这样在下一层的时候进入循环我就可以判断上一层垒的骰子的最上面的那个数字是什么,因为我们可以通过底面的那个数字推断出最上面的那个数字是什么,而且只需要记录下上一层的底面的那个数字是什么,因为之前的骰子我是已经垒好了的,不需要进行判断了,只需要传递进去上一次对下一次调用有影响的变量即可

这些都是题目中给出的限制条件,上一个状态的情况往往直接关系到下一个状态是否能够转变,所以需要将这些具有限制性的变量传递到方法中去

其实我觉得最重要的还是结合实际的题目来确定我们需要什么,什么是限制性的条件,传入的变量往往是上一个状态对下一个状态有影响的变量,逼近出口的变量,记录中间过程的变量或者数据结构