大家好,又见面了,我是你们的朋友全栈君。
所谓递归,简单点来说,就是一个函数直接或间接调用自身的一种方法,它通常把一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解。
引用知乎大佬的例子:
我们可以把” 递归 “比喻成 “查字典 “,当你查一个词,发现这个词的解释中某个词仍然不懂,于是你开始查这第二个词。 可惜,第二个词里仍然有不懂的词,于是查第三个词,这样查下去,直到有一个词的解释是你完全能看懂的,那么递归走到了尽头,然后你开始后退,逐个明白之前查过的每一个词,最终,你明白了最开始那个词的意思。
我们把查字典理解成一个函数search(){}
,而“明白了”就是停止条件。
按这个思路,那这个流程就是这样的:
public void search(){
//如果明白了就停止函数
if("明白了"){
return;
}
//没明白调用自己继续查
search();
}
我们举个简单的例子:
要计算阶乘1*2*3*.....*(n-1)*n
,代码如下:
public static int mult(int n) {
//终止条件,当n=1时直接返回1
if (n == 1){
return n;
}
//计算n*(n-1).....
return n * mult(n - 1);
}
递归的过程就是出入栈的过程
递归的问题实际上都能拆分成出入栈问题,我们可以举上面计算1*2*3*.....*(n-1)*n
这个例子来理解一下:
如果n=4,那么过程就是这样:
用出入栈的思维理解:
递归的本质就是栈的出入过程,所以实际上当深度过深,超过了jvm规定允许的栈最大深度的时候,就会出现栈溢出的问题,也就是java里的StackOverflowError
那么,我们是时候可以使用递归来解决问题呢:
比如之前的文章中提到连续乘除问题就是一个典型的例子。
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/170814.html原文链接:https://javaforall.cn