本帖最后由 传奇查 于 2015-11-22 18:20 编辑
感觉对你有用就给个鼓励吧~~
总结了4个通用案列~不多说~看代码~
需求:列出指定目录下所有目录(包含子目录内的目录)
- package cn.fuxi._08io;
- /**
- * 递归
- * 函数自身直接或者间接的调用到了自身.
- * 一个功能在被重复使用,并每次使用时,参与运算的结果和上一次调用有关.这时可以用递归来解决问题
- *
- * P.S.
- * 1.递归一定明确条件,否则容易栈溢出.
- * 2.注意一下递归的次数.
- *
- * 需求:对指定目录经行所有内容的列出(包含子目录中的内容),也可以理解为深度遍历
- */
- import java.io.*;
- public class _02FileRecursiveDemo1 {
- public static void main(String[] args) {
- File dir = new File("D:\\develop\\workspace\\fuxi4\\src");
- int level = 0;//目录层级
- listAll(dir,level);
- }
- public static void listAll(File dir ,int level){
- System.out.println(getSpace(level)+"dir:"+dir.getAbsolutePath());//getSpace()打印出更直观的效果,或者直接用level取代该方法用数字表示也可以
- level++;
- File[] files = dir.listFiles();//获取完整路径名
- //基本for循环,或者增强for循环二选一~
- /*
- for(int x = 0 ;x < files.length;x++){
- if(files[x].isDirectory()){
- listAll(files[x],level);
- }
- }
- */
- //增强for循环
- for(File ff:files){
- if(ff.isDirectory()){
- listAll(ff,level);
- }
- }
- }
- public static String getSpace(int level){
- StringBuilder sb = new StringBuilder();//创建容器接收字符串输出效果
- sb.append("|--");
- for(int x = 0;x< level; x++){
- sb.append("|");//输出时每多一道"|"代表多一级子类目录
- }
- return sb.toString();
- }
- }
复制代码 输出结果:
|--dir:D:\develop\workspace\fuxi4\src
|--|dir:D:\develop\workspace\fuxi4\src\cn
|--||dir:D:\develop\workspace\fuxi4\src\cn\fuxi
|--|||dir:D:\develop\workspace\fuxi4\src\cn\fuxi\_01system
|--|||dir:D:\develop\workspace\fuxi4\src\cn\fuxi\_02runtime
|--|||dir:D:\develop\workspace\fuxi4\src\cn\fuxi\_03math
|--|||dir:D:\develop\workspace\fuxi4\src\cn\fuxi\_04date
|--|||dir:D:\develop\workspace\fuxi4\src\cn\fuxi\_05calendar
|--|||dir:D:\develop\workspace\fuxi4\src\cn\fuxi\_06io
|--|||dir:D:\develop\workspace\fuxi4\src\cn\fuxi\_07io
|--|||dir:D:\develop\workspace\fuxi4\src\cn\fuxi\_08io
需求:利用递归求任意正整数的十以内进制值
- package cn.fuxi._08io;
- /**
- * 需求:利用递归求任意正整数的十以内进制值
- */
- public class _03FileRecursiveDemo2 {
- public static void main(String[] args) {
- int x = 10;
- int radix = 8;
- toBinary(x,radix);
- }
- public static void toBinary(int x,int radix){
- if(x>0){//如果x是大于0的
- toBinary(x/radix,radix);//递归调用本函数,参数除以进制数
- System.out.print(x%radix);//输出除以进制数余下的数
- }
- }
- }
复制代码 输出结果:
12
需求:利用递归求任意数到任意数的和
- package cn.fuxi._08io;
- /**
- * 需求:利用递归求任意数到任意数的和
- */
- public class _04FileRecursiveDemo3 {
- public static void main(String[] args) {
- int a = 19;
- int b = 298;
- System.out.println(getSum(a,b));
- }
- public static int getSum(int a,int b){
- if(a==b){//用在初始值a和b就相同时,还有最终a或b增长到一样大时
- return a;//或return b;
- }else if(a<b){//a<b的话,递归a到b的和
- return a+getSum(a+1,b);
- }else{//a>b的话,递归b到a的和
- return b+getSum(a,b+1);
- }
- }
- }
复制代码 输出结果:
44380
需求:删除一个带内容的目录.
- package cn.fuxi._08io;
- /**
- * 需求:删除一个带内容的目录.
- * 原理:必须从里往外删,需要进行深度遍历.
- */
- import java.io.*;
- public class _05FileRecursiveDemo4 {
- public static void main(String[] args) {
- File dir = new File("D:\\develop\\workspace\\fuxi4\\a");
- removeDir(dir);
- }
- public static void removeDir(File dir){//记住是先删内层
- File[] files = dir.listFiles();//注意:list()和listFiles()的区别,list()是文件内的文件的【字符串文件名】,listFiles()是文件内的文件的【完整路径名】.
- for(File ff: files ){//先增强for循环,取到每个子文件的路径,由内往外删除
- if(ff.isDirectory()){//是文件目录吗?
- removeDir(ff);//是的话就递归进入循环
- }else{//不是目录的话就打印并删除(内层)
- System.out.println(ff +":"+ff.delete());
- }
- }//跳出循环,外层不是目录的话就打印并删除
- System.out.println(dir+":"+dir.delete());
- }
- }
复制代码 输出结果:
D:\develop\workspace\fuxi4\a\asd\b:true
D:\develop\workspace\fuxi4\a\asd\c\abc:true
D:\develop\workspace\fuxi4\a\asd\c:true
D:\develop\workspace\fuxi4\a\asd:true
D:\develop\workspace\fuxi4\a\sadgsd:true
D:\develop\workspace\fuxi4\a\新建文件夹\a\sda:true
D:\develop\workspace\fuxi4\a\新建文件夹\a:true
D:\develop\workspace\fuxi4\a\新建文件夹:true
D:\develop\workspace\fuxi4\a:true
感觉对你有用就给个鼓励吧~~
|
|