2020-11-24

递归:Recursion,在函数定义中又调用了自身。基本上所有递归问题都可以使用递推公式来表示!
1、满足递归的条件:
(1)、一个问题的解能够拆分为多个子问题的解,并且子问题与该问题除了在数据规模上不同,求解思路完全相同。【递推式】
(2)、有递归出口,否则会死循环。
2、递归存在的两大问题:
(1)、堆栈溢出。使用递归会借用系统栈,每次调用时进栈,直到满足递归终止条件才出栈。而系统栈(虚拟机栈)空间一般不大,当递归调用层数很深时,会有栈溢出的风险。
(2)、重复计算。【递归+记忆数组可以解决重复计算问题----->动态规划算法时再讲!】
3、循环和递归:循环都可以改写成递归,但递归不一定能改成循环。但是递归空间复杂太高,存在堆栈溢出风险、重复计算太多,因此最好能用迭代循环方式将递归改为非递归形式!!!
4、递归应用:

1、阶乘问题:
// 当n足够大时:int--->BigInteger--->数组/字符串【大数相乘(分治法章节再讲)】
	public BigInteger factorial(int n) {
		if (n == 0) {
			return BigInteger.ONE;
		}
		return BigInteger.valueOf(n).multiply(factorial(n - 1));
	}
	
2、目录拷贝:【涉及文件操作、流IO】
	/**
	 * 将source下所有文件拷贝到target目录下
	 * 
	 * @param source:源目录
	 * @param target:目的目录
	 */
	public void copyDir(File source, File target) {
		if (source.isFile() || !source.exists()) {
			return;
		}
		File newDir = new File(target, source.getName());
		newDir.mkdir();

		File[] files = source.listFiles();
		FileInputStream fis = null;
		BufferedOutputStream buffer = null;
		for (File file : files) {
			if (file.isFile()) {// 是文件直接拷贝
				// 字节流
				try {
					fis = new FileInputStream(file);
					buffer = new BufferedOutputStream(new FileOutputStream(new File(newDir, file.getName())));

					int len = 0;
					byte bytes[] = new byte[1024];
					while ((len = fis.read(bytes)) != -1) {
						buffer.write(bytes, 0, len);
					}

				} catch (Exception e) {
					e.printStackTrace();
				} finally {
					if (fis != null) {
						try {
							fis.close();
						} catch (IOException e) {
							e.printStackTrace();
						}
					}
					if (buffer != null) {
						try {
							buffer.close();
						} catch (IOException e) {
							e.printStackTrace();
						}
					}

				}

			} else {
				copyDir(file, newDir);
			}
		}
	}
更多递归在分治、动态规划等算法讲解
	/*
	 * 文件操作: 
	 * 1、listFiles()返回目录下的所有文件和目录,即File[]数组。
	 * 2、list()返回目录下的所有文件和目录名,即String[]数组。
	 * 3、delete()删除文件或目录,注意当目录下还有文件时不能删除! 
	 * 4、createNewFile()创建文件   mkdir()创建目录
	 * 5、isFile()/isDirector()判断是文件还是目录
	 */
	public static void doFile() {
		File delfile = new File("F:/数据备份");
		File[] files = delfile.listFiles();
		for (int i = 0; i < files.length; i++) {
			System.out.println(files[i].getName());
			if (files[i].isDirectory()) {
				files[i].delete();
			}
		}
		String[] list = delfile.list();
		for (String strFile : list) {
			System.out.println(strFile);
		}
	}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值