递归:
自己调用自己:
递归,指在当前方法内调用自己的这种现象
递归分为两种,直接递归和间接递归。
直接递归称为方法自身调用自己。间接递归可以A方法调用B方法,B方法调用C方法,C方法调用A方法。
public static void main(String[] args) {a();}//递归/* 注意事项*1.必须有出口,否则无意义* 2.构造方法不能递归* 3.递归的次数不能过多(内存有限)* */ public static void a(){a();}}
注意:递归一定要有条件限定,保证递归能够停止下来,否则会发生栈内存溢出。
在递归中虽然有限定条件,但是递归次数不能太多。否则也会发生栈内存溢出。
public static void main(String[] args) {// 用递归计算1-100的和int sum=get(100);System.out.println(sum);int con=getn(5);System.out.println(con);}public static int get(int n){if(n==1){return 1;}return n+get(n-1);}public static int getn(int a){if(a==1){return 1;}return a*getn(a-1);}
斐波那契数列
public static void main(String[] args) {// TODO Auto-generated method stubint sum =get(12);System.out.println(sum);}public static int get(int n){//出口 判断条件是最后的出口if(n==1){return 1;}if(n==2){return 1;}return get(n-1)+get(n-2);}}结果:144
递归打印所有子目录中的文件路径
步骤:
1. 指定要打印的目录File对象
2. 调用getFileAll()方法
2.1 获取指定目录中的所有File对象
2.2 遍历得到每一个File对象
2.3 判断当前File 对象是否是目录
判断结果为true,说明为目录,通过递归,再次调用步骤2的getFileAll()方法
判断结果为false,说明是文件,打印文件的路径
package com.oracle.demo01;import java.io.File;public class demo05 {public static void main(String[] args) {File file=new File("D:\\demo0611");getFile(file);}public static void getFile(File file){//打印文件夹名 System.out.println(file);//获取改目录下的所有文件和文件加 File[] files= file.listFiles();//便利for(File f:files){//判定-if(f.isDirectory()){//-如果是文件夹就继续打印 getFile(f);//继续调用(f)再一次传入 }else{//如果f不是文件加,继续打印 System.out.println(f);}}}}
搜索指定目录中的.java文件(含子目录)
需求:打印指定目录即所有子目录中的.java文件的文件路径
要求:编写一个方法用来打印指定目录中的.java文件路径,并进行方法的调用
若指定的目录有子目录,那么把子目录中的.java文件路径也打印出来
步骤:
1. 指定要打印的目录File对象
2. 调用getFileAll()方法,传入要打印的目录File对象
2.1 通过FilenameFilter过滤器获取指定目录中的所有.java类型的File对象
2.2 遍历得到每一个File对象
2.3 判断当前File 对象是否是目录
判断结果为true,说明为目录,通过递归,再次调用步骤2的getFileAll()方法
判断结果为false,说明是文件,打印文件的路径
1.1 实现代码步骤
l 测试类publicclass FileDemo4 {publicstaticvoid main(String[] args) {File file = new File("d:\\test");getFileAll(file);}//获取指定目录以及子目录中的所有的文件 publicstaticvoid getFileAll(File file) {File[] files = file.listFiles(MyFileFilter());//遍历当前目录下的所有文件和文件夹for (File f : files) {//判断当前遍历到的是否为目录if(f.isDirectory()){//是目录,继续获取这个目录下的所有文件和文件夹 getFileAll(f);}else{//不是目录,说明当前f就是文件,那么就打印出来 System.out.println(f);}}}}l 自定类继承FilenameFilter过滤器接口//定义类实现文件名称FilenameFilter过滤器class MyFileFilter implements FilenameFilter{publicboolean accept(File dir, String name) {return name.endsWith(".java");}}