1、什么是递归
递归是一种编程技巧,指的是在程序中调用自身的过程。一个过程或函数在其定义或说明中有直接或间接调用自身的一种方法,通常把一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解,递归策略只需少量的程序就可描述出解题过程所需要的多次重复计算,大大地减少了程序的代码量。
在具体实现中,递归需要有边界条件、递归前进段和递归返回段。当边界条件不满足时,递归前进;当边界条件满足时,递归返回。在数学和计算机科学中,递归指由一种(或多种)简单的基本情况定义的一类对象或方法,并规定其他所有情况都能被还原为其基本情况。
请注意,虽然递归在很多情况下是一种非常有效的编程技巧,但也可能导致程序运行效率低下或出现栈溢出等问题。因此,在实际编程中,需要根据具体情况慎重使用递归。
package IOTest;
/**
* 目标:认识一下递归形式
*/
public class RecursionTest1 {
public static void main(String[] args) {
test1();
}
//直接方法递归
public static void test1(){
System.out.println("-------方法递归-------");
//方法递归:自己调用自己
test1();
}
//间接方法递归
public static void test2(){
System.out.println("---------test2----------");
test3();
}
public static void test3(){
test2();//间接递归
}
}
2、案例-计算n的阶乘
package IOTest;
/**
* 掌握递归应用,执行流程和算法思想
*/
public class RecursionTest2 {
public static void main(String[] args) {
System.out.println("5的阶乘是"+f(5));
}
public static int f(int n){
//终结点
if(n==1){
return 1;
}else {
return f(n-1) * n;
}
}
}
执行流程
递归三要素
- 递归的公式
- 递归的终结点
- 递归的方向必须走向终点
案例-猴子吃桃问题
package IOTest;
/**
* 猴子吃桃问题----经典递归面试题
*/
public class RecursionTest4 {
//公式
//f(x) = 2*f(x + 1) + 2
public static void main(String[] args) {
System.out.println("猴子第一天吃的桃子个数为:"+CT(1));
System.out.println("猴子第二天吃的桃子个数为:"+CT(2));
System.out.println("猴子第三天吃的桃子个数为:"+CT(3));
}
//CT(吃桃)
public static int CT(int n){
if(n == 10){
return 1;
}else {
return 2*CT(n+1)+2;
}
}
}
案例-文件的搜索
package IOTest;
import java.io.File;
import java.io.IOException;
public class RecursionTest5 {
public static void main(String[] args) throws IOException {
searchFile(new File("D:/"),"QQ.exe");
}
/**
* 去目录下搜索某个文件
* @param dir 目录
* @param fileName 要搜索的文件名称
*/
public static void searchFile(File dir ,String fileName) throws IOException {
//1、把非法的情况都拦截住
//dir.exists()路径不存在返回false,所以要取反进入到if中执行的语句
if(dir == null || !dir.exists() || dir.isFile()){
return; //代表无法搜索
}
//2、dir不是null,存在,一定是目录对象
File[] files = dir.listFiles();
//3、判断当前目录下是否存在一级文件对象,以及是否可以拿到一级文件对象
if(files != null && files.length > 0){
//4、遍历全部一级文件对象
for (File f : files) {
//5、判断文件是否是文件(文件夹、文件)
if(f.isFile()){
//是文件,判断这个文件是否是我们要找的
if(f.getName().contains(fileName)){
System.out.println("找到了:" + f.getAbsolutePath());
//找到之后直接运行
Runtime runtime = Runtime.getRuntime();
runtime.exec(f.getAbsolutePath());
}
}else {
//是文件夹,继续重复这个过程(递归)
searchFile(f,fileName);//f是现在遍历到的文件夹,fileName是需要查找的文件名
}
}
}
}
}