目录
1.递归
2.递归累和
分析
3.递归求阶乘
分析
4.文件搜索
分析
1.递归
程序中的递归: 方法自己调用自己
注意:
1.递归一定要有出口,否则会报栈内存溢出错误StackOverflowError
2.递归的出口不能太晚,否则会报栈内存溢出错误StackOverflowError
package com.jcli;
/**
* 递归
*/
public class Test07 {
static int count = 0;
public static void main(String[] args) {
/*
程序中的递归: 方法自己调用自己
注意:
1.递归一定要有出口,否则会报栈内存溢出错误StackOverflowError
2.递归的出口不能太晚,否则会报栈内存溢出错误StackOverflowError
*/
method();
}
private static void method() {
count++;
if (count == 100) {
return;
}
System.out.println("HelloWorld:" + count);
method();
}
}
Exception in thread "main" java.lang.StackOverflowError
2.递归累和
- 定义一个方法,使用递归计算1 ~ n的累加和
分析
- 定义一个方法
- 什么时候开始递归---->找规律
- 规律:
- 1的累加和 = 1
- 2的累加和 = 2 + 1
- 3的累加和 = 3 + 2 + 1
- 4的累加和 = 4 + 3 + 2 + 1
- 5的累加和 = 5 + 4 + 3 + 2 + 1
- ...
- n的累加和 = n + (n-1)的累加和
- 什么时候结束递归
- 计算到1的累加和就结束递归
package com.jcli;
/**
*递归累和
*/
public class Test08 {
public static void main(String[] args) {
System.out.println(getSum(6));//21
}
/**
*递归计算1 ~ n的累加和
* @param i
* @return
*/
private static int getSum(int i) {
// 出口
if (i == 1) {
return 1;
}
// 规律
return i + getSum(i - 1);
}
}
3.递归求阶乘
- 计算n的阶乘
分析
阶乘:所有小于及等于该数的正整数的积。
n的阶乘:n! = n * (n-1) *...* 3 * 2 * 1
n的阶乘= n * (n - 1)的阶乘,所以可以把阶乘的操作定义成一个方法,递归调用。
推理得出:n! = n * (n-1)!
package com.jcli;
/**
* 递归求阶乘
*/
public class Test09 {
public static void main(String[] args) {
System.out.println(jieCheng(6));//720
}
/**
* 计算n的阶乘
* @param i
* @return
*/
private static int jieCheng(int i) {
//出口
if(i==1){
return 1;
}
//规律
return i*jieCheng(i-1);
}
}
4.文件搜索
输出day10目录中的所有.java文件的绝对路径
分析
- 定义一个方法,使用递归完成查找
- 获取该文件夹路径下的所有子文件和子文件夹
- 循环遍历所有的子文件和子文件夹
- 判断遍历出来的是否是文件,并且是否是.java结尾的文件,如果是,就打印输出
- 判断遍历出来的是否是文件夹,如果是递归
package com.jcli;
import java.io.File;
/**
* 文件搜索
*/
public class Test10 {
public static void main(String[] args) {
//输出demo0319目录中的所有.java文件的绝对路径。
//File f1 = new File("demo0319");
File f1 = new File("D:\\jclicode\\03\\18\\demo0319");
searchJavaFile(f1);
}
//1. 定义一个方法,使用递归完成查找
private static void searchJavaFile(File dirPath) {
//2. 获取该文件夹路径下的所有子文件和子文件夹
File[] arr = dirPath.listFiles();
//3. 循环遍历所有的子文件和子文件夹
if (arr != null) {
for (File file : arr) {
//4. 判断遍历出来的是否是文件,并且是否是.java结尾的文件,如果是,就打印输出
if (file.isFile() && file.getName().endsWith(".java")) {
System.out.println("file:" + file.getAbsolutePath());
}
//5. 判断遍历出来的是否是文件夹,如果是递归
if (file.isDirectory()) {
searchJavaFile(file);
}
}
}
}
}