一、概述
生活中来说:
父辈种地 -- 挣钱 -- 供养孩子 -- 孩子长大 -- 孩子种地 -- 孩子挣钱 -- 供养孩子 -- 孙子长大 -- 孙子种地
程序中来说:
是指在当前方法中调用自己 的这种现象
注意事项:
1.递归一定要有出口,否则会报 栈内存溢出 异常
2.递归出口完了,还是会报
代码演示:
public class Test {
public static void main (String[] args) {
// 让该方法调用100次
method();
}
// 定义一个全局count
static int count = 0;
// 定义一个方法
public static void method(){
count++;
while (count == 100){
return;
}
System.out.println("method方法执行了..." + count + "次");
method();
// 方法结束的时候继续调用自己,再来一次执行,知道满足while循环,return;之后,就不会在执行以下代码,递归就结束了
}
}
输出结果:
method方法执行了...1次
method方法执行了...2次
method方法执行了...3次
method方法执行了...4次
... ...
method方法执行了...96次
method方法执行了...97次
method方法执行了...98次
method方法执行了...99次
二、递归求累和
递归:
规律:为了清楚什么时候递归
出口:为了结束递归
需求:
使用累加求和:计算1~n的值
1的累加和 = 1
2的累加和 = 1 + 2
3的累加和 = 1 + 2 + 3
n的累加和 = n + (n-1)
public class Test {
public static void main (String[] args) {
System.out.println(getNum(5));
}
public static int getNum(int num){
if(num == 1){
return 1;
}
return num + getNum(num - 1);
}
}
输出结果:
15
三、递归求阶乘
需求:使用递归计算 n 的结成
n! = n * (n-1)
1! = 1
2! = 1 * 2
3! = 1 * 2 * 3
4! = 1 * 2 * 3 * 4
public class Test {
public static void main (String[] args) {
System.out.println(jiecheng(5));
}
public static int jiecheng(int num){
if(num == 1){
return 1;
}
return num * jiecheng(num - 1);
}
}
输出结果:
120
四、递归文件搜索
(关于File文件的详细用法,在上一篇博客https://blog.youkuaiyun.com/m0_60489526/article/details/119985472)
需求:输出 day12 src目录中的所有.Java文件的绝对路径
(忽略我的项目文件路径,纯属为了学习记笔记用的方便,写项目不会这样😂)
public class Test {
public static void main (String[] args) {
File file = new File("D:\\myprojects\\javase0806\\day12_File类与递归&IO流&字符流&字节流\\src");
findFile(file);
}
// 1.定义一个方法,用来获取一个目录中所有符合条件的文件(子文件,子子文件,子子子文件...)
public static void findFile(File file){
// 2.在方法中,获取该目录下的所有子子文件和子目录
File[] files = file.listFiles();
if(files != null){
// 3.在方法中,循环遍历获取到的所有子文件和子目录
for (File file1 : files) {
// 4.在方法中,遍历的时候,需要判断遍历出来的文件还是目录
if(file1.isFile() && file1.getName().endsWith(".java")){
// 5.如果是文件,就判断该文件是否以.java结尾,如果是,就获取其绝对路径,并打印输出
System.out.println(file1.getAbsolutePath());
}
// 6.如果是文件夹,就递归调用该方法
if(file1.isDirectory()){
findFile(file1);
}
}
}
}
}
输出结果:(另类的起名方式我已经 马赛克 了,不要学我😂)