递归算法及IO流前奏(File类)

——我是LGM_Hakka,请多多指教。

递归算法、IO流前奏

递归算法

1、概述

         程序调用自身的编程技巧称为递归(recursion。一个过程或函数在其定义或说明中有直接或间接调用自身的一种方法,它通常把一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解,递归策略只需少量的程序就可描述出解题过程所需要的多次重复计算,大大地减少了程序的代码量。递归的能力在于用有限的语句来定义对象的无限集合。一般来说,递归需要有边界条件、递归前进段和递归返回段。当边界条件不满足时,递归前进;当边界条件满足时,递归返回。

2、注意事项

A:递归一定要有出口,否则会死循环

B:递归的次数不宜过多,不然有可能会造成内存溢出

C:构造方法不能递归调用

3、实例

求斐波那契数列第n项,n<30,斐波那契数列前10项为1,1,2,3,5,8,13,21,34,55…

import java.util.Scanner;
/*
 * 求斐波那契数列第n项,n<30,
 * 		斐波那契数列前10项为 1,1,2,3,5,8,13,21,34,55
 */
public class Fibonacci {
	public static void main(String[] args) {
		// 创建输入对象
		Scanner sc = new Scanner(System.in);
		System.out.println("请输入,你需要查找的第几项(大于0的整数)");
		// 接收用户需要查找的项数
		int num = sc.nextInt();
		// 定义一个变量,用于接收返回值
		int result = method(num);
		// 打印
		System.out.println("在斐波那契数列中,第" + num + "项为:" + result);
	}

	/**
	 * 这是一个求【1,1,2,3,5,8,13,21,34,55...】数列的方法 递归方法
	 * 
	 * @param i
	 *            第几项
	 * @return 返回传入参数项对应的值
	 */
	private static int method(int i) {
		// 结束递归的条件
		if (i == 1) {
			return 1;
		} else if (i == 2) {
			return 1;
		}
		return method(i - 1) + method(i - 2);
	}
}

IO流前奏

File类

1、概述

文件和目录路径名的抽象表示形式。

2、常用构造方法

File( String pathname );// 根据指定的路径创建File对象,可以指向文件,也可以指向文件夹。(指定的这个路径文件不会自动创建)

3、创建文件、目录方法

	public boolean createNewFile();// 创建文件,如果文件不存在就创建;如果存在就不创建
	public boolean mkdir();//创建单级目录,如果目录不存在创建,存在不创建
	public boolean mkdirs();// 创建多及目录,如果不存在则创建,如果存在不创建

4、删除方法

public booleandelete();// 既可以删除文件,也可以删除文件夹。删除的是文件还是文件夹取决于调用这个方法包装的是路径还是文件。

注意事项:

A:如果删除的是多级目录,不可以直接删除,必须一级一级的删除。

B:Java的删除方法,一旦删除,在回收站是找不到被删除的数据的。

5、判断方法

	boolean exists();	// 判断File对象是否存在
	boolean isFile();	// 判断File对象是否是文件
	boolean isDirector();	// 判断File对象是否是文件夹
	boolean isAbsolute();	// 判断File对象是否是绝对路径
	boolean canRead();	// 判断File对象是否可读
	boolean canWrite();	// 判断File对象是否可写
	boolean isHidden();	// 判断File对象是否隐藏

6、获取功能

	String getAbsolutePath();// 获取File对象封装的绝对路径
	String getPath();//	获取File对象封装的相对路径
	String getName();//	获取File对象封装路径或文件的名字
	long length();// 获取File对象封装文件的大小,单位是字节
	long lastModified();// 获取上一次修改文件的时间,返回的是修改时的毫秒值.
	public static File[] listRoots();//	列出可用的系统根目录
	public String[] list();// 获取指定目录下文件和文件夹名字的字符串数组
	public File[] listFiles();// 获取指定目录下文件和文件夹对象的数组

7、绝对路径、相对路径

绝对路径:以盘符开始的路径。

相对路径:不以盘符开始的路径。如果实在项目中使用相对路径,相对路径代表的就是项目下的路径。

8、实例

import java.io.File;
import java.io.IOException;

public class FileTest {
	public static void main(String[] args) throws IOException {
		File dir = new File("E:\\Test");// 封装目录
		boolean b1 = dir.mkdir(); // 创建单级目录,如果目录不存在创建,存在不创建

		File dirs = new File("E:\\Test00\\Test01"); // 封装目录
		boolean b2 = dirs.mkdirs(); // 创建多级目录,如果目录不存在创建,存在不创建

		File file = new File("E:\\Test.java");// 封装文件

		boolean b3 = file.createNewFile();// 创建文件,如果文件不存在就创建;如果存在就不创建
		boolean b4 = file.exists(); // 判断File对象是否存在
		boolean b5 = file.isFile(); // 判断File对象是否是文件
		boolean b6 = file.isDirectory();// 判断File对象是否是文件夹
		boolean b7 = file.isAbsolute(); // 判断File对象是否是绝对路径
		boolean b8 = file.canRead(); // 判断File对象是否可读
		boolean b9 = file.canWrite(); // 判断File对象是否可写
		boolean b10 = file.isHidden(); // 判断File对象是否隐藏
		boolean b11 = file.delete(); // 既可以删除文件,也可以删除文件夹。删除的是文件还是文件夹取决于调用这个方法包装的是路径还是文件。

		String str1 = file.getAbsolutePath();// 获取File对象封装的绝对路径
		String str2 = file.getPath();// 获取File对象封装的相对路径
		String str3 = file.getName();// 获取File对象封装路径或文件的名字

		long len = file.length();// 获取File对象封装文件的大小,单位是字节
		long time = file.lastModified();// 获取上一次修改文件的时间,返回的是修改时的毫秒值.

		File[] files = File.listRoots();// 列出可用的系统根目录
		String[] dirFile = dirs.list();// 获取指定目录下文件和文件夹名字的字符串数组
		File[] dirFiles = dirs.listFiles();// 获取指定目录下文件和文件夹对象的数组
	}
}

9、递归算法在结合File类的实例

import java.io.File;

/*
 * 获取指定文件夹中的指定后缀名文件,打印
 * 
 * 思路:
 * 1、封装文件对象
 * 2、获取指定文件夹下所有文件及文件夹对象数组
 * 3、遍历数组,判断其是文件还是文件夹
 * 		若为文件夹,利用递归
 * 		若为文件,判断是否以.java后缀名结尾
 * 			若是,则输出
 */
public class FindFile {
	public static void main(String[] args) {
		// 封装文件对象
		File file = new File("E:\\ workspaces\\MyCode");
		findJavaFile(file);
	}

	private static void findJavaFile(File file) {
		// 获取指定文件夹下所有文件及文件夹对象数组
		File[] files = file.listFiles();
		// 遍历数组,判断其是文件还是文件夹
		for (File f : files) {
			// 若为文件夹,利用递归
			if (f.isDirectory()) {
				findJavaFile(f);
			}
			// 若为文件,判断是否以.java后缀名结尾
			if (f.getName().endsWith(".java")) {
				// 打印该文件的绝对路径
				System.out.println(f.getAbsolutePath());
			}
		}
	}
}

你可能感兴趣的:(Java,SE)