现在有这样一个需求,给你一个目录,需要你在此目录中查找全部名字中包含指定字符的文件。

这题的主要难点在于:目录中可能包含子目录,子目录中又会包含子目录。而我们事先没办法确定子目录到底有多少层!这时候就需要用到递归算法了。

说起递归,通过一个例子相信大家并不难理解。我们小时候都听过一个故事:从前有座山,山里有座庙,庙里有个老和尚,老和尚在给大家讲故事。故事的内容是这样的:从前有座山,山里有座庙,庙里有个老和尚,老和尚在给大家讲故事。故事的内容是这样的:从前有座山......

我们都知道,以上的故事就是在无限循环。从编程的角度来说,这就是典型的死循环。而递归其实和这个类似,也是一个无限循环过程。但递归和死循环之间有一个非常重要的特征:那就是终止条件。我们都知道,死循环是没办法结束的,所以称之为死循环。但递归是有终止条件的,只要这个条件满足,递归的循环就会立即结束。所以你也可以简单的把递归理解为可以结束的无限循环(之所以称之为无限循环,是因为我们谁也不能确定这个终止条件什么时候会发生,也就是事先谁也不确定这个循环会执行多少次,反正只是知道他能结束就对了)。如果你恰好有这样的场景,那么不用怀疑,你需要使用递归算法来完成你的工作!

上面的需求正好就满足这个递归的场景。因为我们需要到目录中查找文件,而一个目录中可能有文件,也可能会有子目录,子目录中也是同样的情况。这就形成了一个循环,即在一个目录中检查文件和子目录。如果此目录中出现了子目录,需要重复以上动作。使用递归的原因在于,虽然我们可以重复以上的动作,但我们并不确定子目录到底会存在多少层。所以事先并不知道我们的循环会执行多少次。但我们循环结束的条件是确定的,即当查找到某个目录的时候,如果此目录中没有子目录了,那我们的循环就可以结束了。以上就是递归算法在本例当中的使用分析,下面我们通过代码来实现这个过程:

打开Eclipse,新建一个Java Project,命名为recursion.

在src中新建包file--新建类Search.java

本次实例我们在D盘新建目录test,然后我们在此目录内查找名称中含"hello"的全部文件,d:est目录的结构是这样的:

D:est

------a(folder)

--------my(folder)

-------new(folder)

-------hellofy.java

-------这是hello.txt

--------hello.sql

说明:1、test目录下有目录a

2、a 目录下有目录my和文件hello.sql

3、my目录下有目录new和文件 这是hello.txt

4、new目录下有文件 hellofy.java

程序所使用的目录结构

我们的程序指定到目录D:est,需要找到此目录中包含hello的文件,代码如下:

package file;import java.io.*;public class Search {/// 要查找的文件名(包含)private String containFileName = "hello";/** * 递归查找指定文件夹内含指定文件名的文件 *  * @param path */public void findChild(String path) {      File file = new File(path);      File[] children = file.listFiles();///得到此目录内的全部文件与子目录列表      if (children != null) {             for (File item : children) {                   if (item.isDirectory()) {//如果是目录,继续调用自身方法,实现递归调用                          findChild(item.getAbsolutePath());// 递归调用方法本身,将当前子目录作为参数传递进去                   } else {                         if (item.getName().contains(containFileName)) {                               System.out.println("找到文件:" + item.getAbsolutePath());                          }                   }              }       }}       public static void main(String[] args) throws Exception {      Search test = new Search();      test.findChild("d:est");     }}

运行以上代码,得到结果:

找到文件:d:estahello.sql

找到文件:d:estamyewhellofy.java

找到文件:d:estamy这是hello.txt

java实现递归下降分析_使用递归实现检查未知层级目录中的文件-Java实用技能相关推荐

  1. 递归下降分析法(编译原理)

    递归下降分析法的实现方案 递归下降分析法的原理是利用函数之间的递归调用模拟语法树自上而下的构造过程,具体实现方法概述如下: 1)每个非终结符对应一个解析函数: 2)产生式右侧为该产生式左侧非终结符所对 ...

  2. 【编译原理-专题二】递归下降分析子程序

    编译原理-递归下降分析子程序 一.程序功能描述 给定CP语言中简单算术表达式文法G[E]: E→TE' E'→ATE'|ε T→FT' T'→MFT' |ε F→(E) | i A → + | - M ...

  3. 递归下降分析法的基本思想。_语法分析 | 递归下降分析算法

    递归下降分析算法是自顶向下分析算法的一部分. 递归下降分析算法 也称为预测分析 分析高效(线性时间) 容易实现(方便手工编码) 错误定位和诊断信息准确 被很多开源和商业的编译器所采用 GCC 4.0, ...

  4. 递归下降分析程序构造方法

    递归下降分析程序构造方法 作业要求   对于文法 E -> E + T | E – T | T T ->T * F | T / F | F F -> (E) | i 取消左递归后,改 ...

  5. 最全!最完整的递归下降分析法代码!!! (实验报告,代码)

    根据某一文法编制调试递归下降分析程序,以便对任意输入的符号串进行分析.本次实验的目的主要是加深对递归下降分析法的理解. 程序要求: 程序输入/输出示例: 对下列文法,用递归下降分析法对任意输入的符号串 ...

  6. 编译原理中词法分析的递归下降分析法实例--能被5整除的二进制数---c语言实现

    一.前言 又到了一周一度的编译原理实验课,一次实验课上完了,又是大学生必备技能-写实验报告.行了,废话不多说,我直接展现,如何实现编译原理中词法分析的递归下降分析法实例–能被5整除的二进制数的思路.作 ...

  7. 递归下降分析法实现强化计算器

    一. 实验概述 1.使用bison 和 flex 实现扩展版计算器 该计算器支持实型的两种表达,分别是小数和科学计数法. 该计算器支持 加, 减, 乘 除 四种运算 和括号()运算符. 该计算器支持整 ...

  8. 自上而下的语法分析-递归下降分析和LL(1)文法

    对输入的任意单词符号串,试图用一切可能的办法,从文法开始符号(树根)出发,自上而下.自左而右地建立起一棵语法分析树,使得该树的叶结点自左而右地排列起来,刚好就是所给的输入串.显然,这一过程应该与一个最 ...

  9. 语法分析:自上而下分析(递归下降分析法+预测分析法)

    语法分析:自上而下分析 目录 语法分析:自上而下分析 知识背景 递归下降分析法 内容一:根据文法生成子程序 内容二:调用文法开始符号所对应的子程序 预测分析法 内容一:构造预测分析表 内容二:预测分析 ...

最新文章

  1. linux zipinfo 命令详解
  2. 【数字信号处理】傅里叶变换性质 ( 傅里叶变换时移性质示例 )
  3. python opencv Intel Realsense 使用滑动条调整图片的曝光率
  4. python中keys是什么意思_python中key指的是什么
  5. 常见的几种异常类型-熟记
  6. php 正则提取日期,PHP正则匹配日期和时间(时间戳转换)的实例代码
  7. IEEE发布AI三原则:机器人革命中需要保护人类福祉 | 138页报告
  8. 吸血鬼数字—THINKING IN JAVA中一道习题
  9. CamShift算法,OpenCV实现(3):CamShift算法
  10. python模块基础之OS模块
  11. Java 垃圾收集策略、垃圾分代回收算法、垃圾回收运作流程
  12. 春季个人训练赛 5(广工新生赛)
  13. Handler消息机制详解,另对于MessageQueue阻塞线程的详解
  14. Cocoa和Cocoa Touch框架浅析
  15. DBeaver打开sql文件中文乱码问题解决
  16. linux双线双网卡双ip双网关设置方法,centos下双网卡双线双IP的配置方法
  17. NOIP2017 逛公园 (拓扑,dp,最短路)
  18. 百分点科技启动上市:消息称其国内业务持续亏损,苏萌为实控人
  19. MIPS 五级流水线
  20. 一名优秀的合格的架构师,应该具备什么样的特质?

热门文章

  1. Spring干货汇总(含Spring Boot与Spring Cloud)
  2. 第三届广东省强网杯网络安全大赛WEB题writeup
  3. python第七关再来一盘_Python爬虫自学系列(七) — 项目实战篇(一)
  4. linux 终端 含义,ubuntu终端中@前后的字符串含义及修改-布布扣-bubuko.com
  5. RESTful架构风格
  6. c++ 数据类型转换笔记
  7. rknn 学习资料整理
  8. pytorch Flatten展平
  9. pytorch 安装方法
  10. 相似图片检测:感知哈希算法之aHash,dHash,pHash的Python实现