一、什么是递归
所谓递归,简单点来说,就是一个函数直接或间接调用自身的一种方法,它通常把一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解。
我们可以把” 递归 “比喻成 “查字典 “,当你查一个词,发现这个词的解释中某个词仍然不懂,于是你开始查这第二个词。
可惜,第二个词里仍然有不懂的词,于是查第三个词,这样查下去,直到有一个词的解释是你完全能看懂的,那么递归走到了尽头,然后你开始后退,逐个明白之前查过的每一个词,最终,你明白了最开始那个词的意思。
二、递归入门
我们以求n的阶乘为例
我们可能会进行如下处理:
public class Factorial {
public static void main(String[] args) {
int result = 3*2*1;
System.out.println(result);
}
}
那么我们思考一下,这只是计算3的阶乘,如果是20的阶乘呢?10000的阶乘呢?我们该如何解决?
实际上无论计算谁的阶乘,做法都是一样的,问题的关键在于,我们没有把解决问题的方法进行抽取。
三、递归做法
我们为了解决上述问题可以采用递归处理,对于计算阶乘的方法进行抽取,计算n的阶乘就是n*(n-1)*(n-2)…
因此我们可以抽取出fun方法,这种方式就是递归的简单应用。不过要注意一个问题,那就是使用递归的时候要设置终止条件,否则可能就会导致死循环,出现StackOverflowError异常。
public class Factorial {
public static int fun(int n) {
// 终止条件
if(n==1) {
return 1;
}
//返回结果
return n*fun(n-1);
}
public static void main(String[] args) {
// 计算n的阶乘
int result = fun(3);
System.out.println(result);
}
}