什么是递归
简单说,递归就是函数自己调用自己,并在满足一定条件下返回的函数调用现象。
最简单的递归函数就是阶乘函数,factorial函数存在factorial(n-1),因此是递归函数。
public int factorial(int n) {if (n < = 1) {return 1;}return n * factorial(n - 1);
}
进一步剖析「递归」,先有「递」再有「归」,「递」的意思是将问题拆解成子问题来解决, 子问题再拆解成子子问题,...,直到被拆解的子问题无需再拆分成更细的子问题(即可以求解)。「归」是说最小的子问题解决了,那么它的上一层子问题也就解决了,上一层的子问题解决了,上上层子问题自然也就解决了,....,直到最开始的问题解决。文字说可能有点抽象,那我们就以阶层 f(6) 为例来看下它的「递」和「归」。
求解问题 f(6),由于 f(6) = n * f(5),所以 f(6) 需要拆解成 f(5) 子问题进行求解,同理 f(5) = n * f(4) ,也需要进一步拆分,... ,直到 f(1),这是「递」。f(1) 解决了,由于 f(2) = 2 f(1) = 2 也解决了,.... f(n)到最后也解决了,这是「归」。
所以递归的本质是能把问题拆分成具有相同解决思路的子问题,直到最后被拆解的子问题再也不能拆分,解决了最小粒度可求解的子问题后,在「归」的过程中自然顺其自然地解决了最开始的问题。
我们在上一节仔细剖析了什么是递归,可以发现递归有以下两个特点:
所以解递归题的关键在于我们首先需要根据以上递归的两个特点判断题目是否可以用递归来解。
经过判断可以用递归后,接下来我们就来看看用递归解题的基本套路(四步曲):