一,什么是递归
简单地说,就是如果在函数中存在着调用函数本身的情况,这种现象就叫递归。
以阶层函数为例,如下, 在 factorial 函数中存在着 factorial(n - 1) 的调用,所以此函数是递归函数
二,构建递归
- 先定义一个函数,明确这个函数的功能,由于递归的特点是问题和子问题都会调用函数自身,所以这个函数的功能一旦确定了, 之后只要找寻问题与子问题的递归关系即可
- 接下来寻找问题与子问题间的关系(即递推公式),这样由于问题与子问题具有相同解决思路,只要子问题调用步骤 1 定义好的函数,问题即可解决。所谓的关系最好能用一个公式表示出来,比如 f(n) = n * f(n-) 这样,如果暂时无法得出明确的公式,用伪代码表示也是可以的, 发现递推关系后,要寻找最终不可再分解的子问题的解,即(临界条件),确保子问题不会无限分解下去。由于第一步我们已经定义了这个函数的功能,所以当问题拆分成子问题时,子问题可以调用步骤 1 定义的函数,符合递归的条件(函数里调用自身)
- 将第二步的递推公式用代码表示出来补充到步骤 1 定义的函数。
三,图解递归
下面以两图体现递归完整过程
1 ,以 f(5) 为例
2,图解递归计算3!(图片太大只能选f(3)) 四,完整代码
import java.util.*;
public class TestDemo1{
public static void main(String[] args){
System.out.println("请输入想求的阶乘数");
Scanner scan = new Scanner(System.in);
int m = scan.nextInt();
System.out.println(fac(m));
}
public static int fac (int n){
if(n == 1){
return 1;
}
int tmp = n * fac(n-1);
return tmp;
}
}