1,递归的特征:
方法自己调用自己;
注意:递归要有出口(否则会导致内存的溢出),且次数不能太多;
1. 内存溢出的原因:递归的方法不断地调用自己,导致栈内存的空间不够而溢出;
2,递归的思想:
把一个复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解;
递归的使用场景:能用普通循环完成的需求就别用递归,除非无法避免,比如文件的搜索,文件夹还有文件要处理;
3,递归思想的代码举例:
```java public class Text01 {
public static void main(String[] args) {
int sum=setSummary(5); System.out.println(sum);
}
public static int setSummary(int sum){ if (sum==1){
return 1;
} return sum + setSummary(sum-1); }
}
<a name="kPYql"></a>
## 4,流程分析:
![image.png](https://cdn.nlark.com/yuque/0/2022/png/25975946/1645239612735-077334bd-a979-43ae-9c70-8701e65c6d29.png#clientId=u07a523ab-8437-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=834&id=uf2c1367e&margin=%5Bobject%20Object%5D&name=image.png&originHeight=834&originWidth=850&originalType=binary&ratio=1&rotation=0&showTitle=false&size=88408&status=done&style=none&taskId=ub63af189-e7c5-4fc7-841b-fb049bf11e3&title=&width=850)
<a name="lWtTO"></a>
## 5,递归的案例-文件搜索:!!!
1. **拓展**:**endsWith**:判断字符串结尾(后缀)的内容,**startsWith**:就是判断前缀;
```java
public class Text01 {
public static void main(String[] args) throws IOException {
//在xxx文件夹创建.java文件
File file = new File("G:\\xxx\\ab.java");
file.createNewFile();
//创建xxx文件夹对象
File file1 = new File("G:\\xxx");
//调用方法
setListFiles(file1);
}
public static void setListFiles(File file) {
//获取文件夹内容并放到File对象中;
File[] files = file.listFiles();
for (File file1 : files) {
//判断文件夹里面的内容是否为文件
if (file1.isFile()) {
//获取文件名称并判断后缀是否为.java
if (file1.getName().endsWith(".java")) {
System.out.println(file1);
}
}
//不是文件就递归;
else {
setListFiles(file);
}
}
}
}
- 注意:如果File对象一直是同一个的话,再去递归进行遍历就导致空指针异常;