递归,指在当前方法内调用自己的现象。
public void method(){ System.out.println(“递归的演示”); //在当前方法内调用自己 method(); }
递归分为两种:直接递归(方法自身直接调用自己)和间接递归(可以A方法调用B方法,B方法调用C方法,C方法再调用A方法)。
1.计算1~n的和,使用递归完成
import java.util.Scanner; public class DiGuiDemo { public static void main(String[] args) { //计算1~num的和,使用递归完成 System.out.println("现在计算1~n的和"); System.out.println("请输入n的值:"); Scanner in = new Scanner(System.in); int n = in.nextInt(); int sum = getSum(n); System.out.println("1~"+n+"的和为:"+sum); } public static int getSum(int n) { if(n == 1){ return 1; } return n + getSum(n-1); } }
运行结果为:
注意:递归 一定要有条件限定,保证递归能停止,否则会发生栈内存溢出。
在递归中虽然有限定条件,但是递归次数不能太多,否则也会发生栈内存溢出。
2.递归求阶乘
import java.util.Scanner; public class DiGuiDemo { public static void main(String[] args) { System.out.println("请输入n,将计算n的阶乘:"); Scanner in = new Scanner(System.in); int n = in.nextInt(); System.out.println(n+"!="+getJieCheng(n)); } /* * 计算阶乘 5! * 5*4*3*2*1 */ public static int getJieCheng(int n){ if ( n == 1) return 1; return n * getJieCheng(n-1); } }
运行结果为:
3.递归遍历全目录
import java.io.File; /* * 对一个目录的下的所有内容,进行完全的遍历 * 使用方法的递归调用 */ public class FileDemo { public static void main(String[] args) { File dir = new File("d:\\code"); getAllDir(dir); } /* * 定义方法,实现目录的全遍历 */ public static void getAllDir(File dir){ System.out.println(dir); //调用方法listFiles()对目录,dir进行遍历 File[] fileArr = dir.listFiles(); for(File f : fileArr){ //判断变量f表示的路径是不是文件夹 if(f.isDirectory()){ //是一个目录,就要去遍历这个目录 //本方法,getAllDir,就是给个目录去遍历 //继续调用getAllDir,传递他目录 getAllDir(f); }else{ System.out.println(f); } } } }
运行结果为:(得到d盘code文件夹中所有文件及子文件夹中的文件)
4.搜索指定目录中的Java文件(含子目录)
测试类
import java.io.File; /* * 遍历目录,获取目录下的所有.java文件 * 遍历多级目录,方法递归实现 * 遍历的过程中,使用过滤器 */ public class DiGuiDemo { public static void main(String[] args) { getAllJava(new File("d:\\code")); } /* * 定义方法,实现遍历指定目录 * 获取目录中所有的.java文件 */ public static void getAllJava(File dir){ //调用File对象方法listFiles()获取,加入过滤器 File[] fileArr = dir.listFiles(new MyJavaFilter()); for(File f : fileArr){ //对f路径,判断是不是文件夹 if(f.isDirectory()){ //递归进入文件夹遍历 getAllJava(f); }else{ System.out.println(f); } } } }
自定义过滤器接口
import java.io.File; import java.io.FileFilter; public class MyJavaFilter implements FileFilter { public boolean accept(File pathname) { //判断获取的是目录,直接返回true if(pathname.isDirectory()) return true; return pathname.getName().toLowerCase().endsWith(".java"); } }
运行结果为:(找到d盘code目录中所有.java文件)
4.递归计算斐波那契数列
斐波那契数列指的是这样一个数列:1,1,2,3,5,8,13,21,34,55,89,144,233,377,610,987,1597......
这个数列的第一项和第二项都为1,从第3项开始,每一项都等于前两项之和。
public class DiGuiDemo { public static void main(String[] args) { System.out.println(getFBNQ(12)); } /* * 方法递归,计算斐波那契数列 * */ public static int getFBNQ(int month){ if( month == 1) return 1; if( month == 2) return 1; return getFBNQ(month-1)+getFBNQ(month-2); }
运行结果为: