一 递归的概述
递归,指在当前方法内调用自己的这种现象
public voidmethod(){
System.out.println(“递归的演示”);//在当前方法内调用自己
method();
}
递归分为两种,直接递归和间接递归。
直接递归称为方法自身调用自己。间接递归可以A方法调用B方法,B方法调用C方法,C方法调用A方法。
递归的代码演示,计算1-n之间的和,使用递归完成
public classDiGuiDemo {public static voidmain(String[] args) {//计算1~num的和,使用递归完成
int n = 5;int sum =getSum(n);
System.out.println(sum);
}public static int getSum(intn) {if(n == 1){return 1;
}return n + getSum(n-1);
}
}
代码执行流程图解
递归一定要有条件限定,保证递归能够停止下来,否则会发生栈内存溢出。
在递归中虽然有限定条件,但是递归次数不能太多。否则也会发生栈内存溢出。
二 递归打印所有子目录中的文件路径
编写一个方法用来打印指定目录中的文件路径,并进行方法的调用
要求:若指定的目录有子目录,那么把子目录中的文件路径也打印出来
步骤:
1. 指定要打印的目录File对象
2. 调用getFileAll()方法
2.1 获取指定目录中的所有File对象
2.2 遍历得到每一个File对象
2.3 判断当前File 对象是否是目录
判断结果为true,说明为目录,通过递归,再次调用步骤2的getFileAll()方法
判断结果为false,说明是文件,打印文件的路径
public classFileDemo2 {public static voidmain(String[] args) {
File file= new File("d:\\test");
getFileAll(file);
}//获取指定目录以及子目录中的所有的文件
public static voidgetFileAll(File file) {
File[] files=file.listFiles();//遍历当前目录下的所有文件和文件夹
for(File f : files) {//判断当前遍历到的是否为目录
if(f.isDirectory()){//是目录,继续获取这个目录下的所有文件和文件夹
getFileAll(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,说明是文件,打印文件的路径
测试类
public classDemo05 {public static void main(String[] args) throwsIOException {
File file= new File("E:\\io0512");
gettxtjava(file);
}public static voidgettxtjava(File file){
File[] files= file.listFiles(newMyFilter());for(File f: files) {if(f.isDirectory()){
gettxtjava(f);
}else{
System.out.println(f);
}
}
}
}
自定类继承FilenameFilter过滤器接口
public class MyFilter implementsFileFilter {
@Overridepublic booleanaccept(File pathname) {boolean b =false;if(pathname.getName().toLowerCase().endsWith(".java")){
b= true;
}if(pathname.isDirectory()){
b= true;
}returnb;
}
}
四 用递归做斐波那契数列
题目:最开始有一对兔子,兔子在第三个月及之后的每个月会生一对小兔子,小兔子第三个月及之后每个月也会生一对小兔子
求一对小兔子在12个月之后有多少对小兔子
public classDemo02 {public static voidmain(String[] args) {
System.out.println(tuzi(12));
}
}
public static int tuzi(inta){if(a==1){return 1;
}if(a==2){return 1;
}return tuzi(a-2)+tuzi(a-1);
}
五 数组冒泡排序
public classDemo02 {public static voidmain(String[] args) {int[] a = {12,1,25,30,25,100,8,35,47,99,11,4};
get(a);for (inti : a) {
System.out.println(i);
}
}
}
public static void get(int[] a){int n = 0;for (int i = 0; i < a.length-1; i++) {for (int j = 0; j < a.length-i-1; j++) {if(a[j]>a[j+1]){
n=a[j];
a[j]= a[j+1];
a[j+1]=n;
}
}
}
}
六 数组快速排序
public classQuickSort {public static voidmain(String[] args) {int[] arr = {12,10,5,25,35,99,1,4,100,78,89,98,3,55};
QuickS(arr,0, arr.length-1);for (inti : arr) {
System.out.print(i+"...");
}
}//快速排序
public static int[] QuickS(int[] arr,int start,intend){int key =arr[start];int i =start;int j =end;while(i
i++;
}while(arr[j]>key&&i
j--;
}if(arr[i]==arr[j]&&i
i++;
j--;
}else{int num =arr[i];
arr[i]=arr[j];
arr[j]=num;
}
}if(i-1>start){
arr= QuickS(arr,start,i-1);
}if(j+1
arr= QuickS(arr,j+1,end);
}returnarr;
}
}
七 搜索指定目录中的.java文件(含子目录)工具类
public classFileFindTool {public static Listgetfiles(File file,String[] filetype){//用来存储目录
List list = new ArrayList();
File[] files= file.listFiles(newMyFilter(filetype));for(File f : files) {//当文件类型为文件夹时
if(f.isDirectory()){//接收返回的list 并添加到总的list里
for(File file2 : getfiles(f, filetype)) {
list.add(file2);
}
}else{//当文件不为文件夹时
list.add(f);
}
}returnlist;
}
}
public class MyFilter implementsFileFilter {privateString[] filetype ;//写个构造方法用来存储字符串数组
publicMyFilter(String[] filetype){this.filetype =filetype;
}publicMyFilter(){
}public booleanaccept(File pathname) {boolean b =false;for(String s : filetype) {if(pathname.getName().toLowerCase().endsWith(s)){
b=true;
}
}if(pathname.isDirectory()){
b= true;
}returnb;
}
}