递归,指在当前方法内调用自己的这种现象
注意 :1.必须有出口,否则无意义
2.构造方法不能递归
3.递归次数不能过多
递归分为两种,直接递归和间接递归。
直接递归称为方法自身调用自己。
间接递归可以A方法调用B方法,B方法调用C方法,C方法调用A方法
例子1-3的和内存图
package com.oracle.demo03; public class Demo02 { public static void main(String[] args) { // TODO Auto-generated method stub System.out.println(add(5)); } //用递归计算1-n的和 /*1-100= * 100+99+98--+1 * 100+(100-1)+(99-1)+..+1 * n+(n-1)+(n-1-1)+(n-1-1-1)+...+1 * */ public static int add(int n){ if (n==1) { return 1; }else{ return n+add(n-1); } } }
1.递归打印所有子目录中的文件路径
步骤
1. 指定要打印的目录File对象
2. 调用getFileAll()方法
2.1 获取指定目录中的所有File对象
2.2 遍历得到每一个File对象
2.3 判断当前File 对象是否是目录
判断结果为true,说明为目录,通过递归,再次调用步骤2的getFileAll()方法
判断结果为false,说明是文件,打印文件的路径
package com.oracle.demo03; import java.io.File; public class Demo03 { public static void main(String[] args) { File f=new File("D:\demo1018"); get(f); } public static void get(File file) { //获取file对象表示的文件下的所有文件和文件夹 File files[]=file.listFiles(); //遍历 for (File f : files) { //如果是文件夹,则继续调用get方法获取改路径下的所有文件 if (f.isDirectory()) { get(f); System.out.println(f); } else { //如果是文件直接打印 System.out.println(f); } } } }
2.搜索指定目录中的.txt文件(含子目录)
把递归打印所有子目录中的文件路径步骤中2.1改为通过FilenameFilter过滤器获取指定目录中的所有.txt类型的File对象
package com.oracle.demo03; import java.io.File; public class Demo04 { public static void main(String[] args) { File f=new File("D:\demo1018"); get(f); } public static void get(File file) { //获取file对象表示的文件下的所有文件和文件夹 File files[]=file.listFiles(new MyFilter()); //遍历 for (File f : files) { //如果是文件夹,则继续调用get方法获取改路径下的所有文件 if (f.isDirectory()) { get(f); //System.out.println(f); } else { //如果是文件直接打印 System.out.println(f); } } } } package com.oracle.demo03; import java.io.File; import java.io.FileFilter; public class MyFilter implements FileFilter { public boolean accept(File pathname) { if (pathname.exists()) { if (pathname.isFile()) { //获取file对象的文件名 //String name=pathname.getName().toLowerCase(); return pathname.getName().toLowerCase().endsWith(".txt"); } return true; } return false; } }