`

“Java 递归”总结

    博客分类:
  • java
阅读更多
递归(Recursion):就是方法调用自身。对于递归来说,一定有一个出口,让递归结束,只有这样才能保证不出现死循环

递归的代码很容易出错,很难调试。


下面是一个简单的递归实例:
package com.shengshiyuan.recursion;

public class Test1 {

	// 循环方式计算阶乘,又叫做迭代的方式(普通方式)
	public int compute(int number) {
		int result = 1;

		for (int i = number; i > 0; i--) {
			result *= i;
		}
		return result;
	}

	// 使用递归方式计算阶乘【重点】
	public int compute2(int number) {
		if (1 == number) {
			return 1;
		} else {
			return number * compute2(number - 1);
		}

	}

	// 测试类
	public static void main(String[] args) {
		Test1 test1 = new Test1();

		System.out.println(test1.compute2(5));
	}
}



最著名的有“斐波那契额数列”。我们这里想要研究的是比如给定一个位置,比如我想要知道斐波那契额数列第20个数是多少。我们下面用递归实现获得此数列第n个数的值:
package com.shengshiyuan.recursion;

public class Fab {
	// 使用递归计算斐波那契数列
	// n表示斐波那契额数列的第几个数
	public int compute(int n) {

		// 递归出口
		if (1 == n || 2 == n) {
			return 1;
		} else {
			return compute(n - 1) + compute(n - 2);
		}
	}

	// 测试类
	public static void main(String[] args) {
		Fab f = new Fab();
		System.out.println(f.compute(9));
	}
}




使用File类的delete()方法删除一个目录的时候,如果这个目录里面包含了目录或文件,这个目录是删不掉的,这个目录必须是一个空的才能被删除。但实际情况中很多时候我们需要删除非空的目录,这种情况下就必须使用递归来实现了,其他方式没法实现,代码如下:
package com.shengshiyuan.recursion;

import java.io.File;

public class FileTest9 {

	/**
	 * 递归删除非空的目录(删除里面还包含目录或文件的目录)
	 * 方法: deleteAll <br>
	 * 描述: TODO <br>
	 * 作者: 
	 * 时间: Nov 7, 2013 4:57:20 PM
	 * @param file
	 */
	public static void deleteAll(File file) {
		// 出口点,当前目录为一个文件或当前目录是一个空的文件夹,直接把它删除掉就完事了
		if (file.isFile() || file.list().length == 0) {
			file.delete();
		} else {
			File[] files = file.listFiles();
			for (File f : files) {
				// 再次递归删除里面的东西
				deleteAll(f);
				// 把里面的东西都删除掉了然后把自己再删掉
				f.delete();
			}
		}
	}

	// 测试类
	public static void main(String[] args) {
		File file = new File("C:/a");
		FileTest9 test = new FileTest9();
		test.deleteAll(file);
	}
}





作业详解:给定任意一个目录,以树形方式展现出该目录中的所有子目录和文件。另外,
在展现的时候将目录排在上面,文件排在下面。每一层要加上缩进。 使用递归实现

下面是老师做样板代码(这个作业有点难,有时间的时候研究看看):
package com.shengshiyuan.recursion;

import java.io.File;
import java.util.ArrayList;

public class ListAllTest {

	// 用于判断目录或文件所处的层次
	private static int time;

	// 递归处理方法
	public static void deepList(File file) {
		// 递归出口,当前目录是文件或当前目录是空的
		if (file.isFile() || file.listFiles().length == 0) {
			// time = 0;
			return;
		} else {
			File[] files = file.listFiles();
			files = sort(files);// 排完序的数组
			for (File f : files) {
				StringBuffer output = new StringBuffer();
				if (f.isFile()) {
					output.append(getTabs(time));
					output.append(f.getName());
				} else {
					output.append(getTabs(time));
					output.append(f.getName());

				}

				// 打印目录结构
				System.out.println(output);

				// f是目录
				if (f.isDirectory()) {
					time++;
					deepList(f);
					time--;
				}
			}
		}

	}

	// 整理文件数组,使得目录排在文件之前
	private static File[] sort(File[] files) {
		ArrayList<File> sorted = new ArrayList<File>();
		// 寻找到所有的目录
		for (File f : files) {
			if (f.isDirectory()) {
				sorted.add(f);
			}
		}

		// 寻找到所有的文件
		for (File f : files) {
			if (f.isFile()) {
				sorted.add(f);
			}
		}
		return sorted.toArray(new File[files.length]);
	}

	// 判断需要加多少tab(缩进)的方法
	private static String getTabs(int time) {
		StringBuffer buffer = new StringBuffer();
		for (int i = 0; i < time; i++) {
			// "\t"为tab键的表示
			buffer.append("\t");
		}
		return buffer.toString();
	}

	public static void main(String[] args) {
		deepList(new File("C:\\a"));
	}
}
分享到:
评论

相关推荐

    Java递归算法(PPT+PDF+Word)

    Java递归算法是一种重要的编程技巧,它通过函数自身调用自身来解决问题。在Java中,递归主要用于解决那些可以通过简化规模来逐步逼近解决方案的问题。这种技术在数据结构(如树和图)、排序算法(如快速排序和归并...

    java 递归问题文档

    总结来说,递归是编程中的重要概念,理解和掌握递归对于提升编程能力非常有益。这个文档提供了一个良好的学习平台,帮助读者深入理解递归,并通过实践应用到实际问题中。在学习过程中,记得结合实例和实际情况去思考...

    java编写的递归算法的经典事例

    ### Java编写的递归算法的经典事例:全排列输出 #### 概述 本文将详细介绍一个用Java编写的递归算法实例,该实例用于实现字符数组的所有可能全排列。通过这个例子,我们可以深入理解递归的基本概念、工作原理以及...

    java实现递归调用

    总结来说,Java通过递归调用来遍历树是一种常见的编程技巧,可以方便地实现前序、中序和后序遍历。同时,SQL虽然不直接支持递归,但可以利用自连接实现类似的功能。理解并熟练运用递归调用,对于理解和解决复杂问题...

    java 中的经典递归

    ### Java中的经典递归 #### 一、递归的基本概念 递归是一种常见的算法思想,在计算机科学中占有重要地位。简单来说,递归是指在函数的定义或执行过程中调用自身的方法。递归通常用于解决那些可以分解为相似子问题...

    Java写的递归下降分析程序

    总结起来,"Java写的递归下降分析程序" 是一个基于Java实现的编译器前端组件,用于解析输入的源代码,将其转换成抽象语法树。它利用递归函数模拟上下文无关文法的推导过程,但可能处于未完成或存在错误的状态。通过...

    无限级树(Java递归)

    ### 无限级树(Java递归)知识点解析 #### 一、概述 本文将深入解析一个基于Java实现的无限级树形结构,并采用递归方式构建。该树形结构主要用于展示具有层级关系的数据,例如网站分类目录等。通过递归查询数据库中...

    java 用递归实现字符串反转

    ### Java使用递归实现字符串反转 在Java编程语言中,递归是一种常用的方法来解决许多问题,特别是那些可以通过分解成更小子问题来解决的问题。本文将详细介绍如何使用递归来实现字符串的反转。 #### 一、递归基础...

    Java语言描述递归删除

    总结来说,这个Java程序展示了如何使用递归来遍历并删除一个目录及其所有子目录中的文件。递归在这里起到了深度优先搜索的作用,使得程序能够有效地处理任意深度的文件结构。同时,通过倒序删除解决了文件和文件夹的...

    java写的递归建树型结构

    在IT领域,构建树型结构是一...总结来说,这个Java程序利用递归思想和数据库操作,构建了一个基于数据的树型结构。理解这些核心概念对于进行类似项目开发至关重要,无论是数据可视化、文件系统管理还是复杂的算法实现。

    java-rar文件递归解压

    总结来说,Java中处理RAR文件的递归解压需要利用第三方库,如Apache Commons Compress,通过读取每个条目并根据其类型创建对应的目录或文件。在编写这样的工具时,要考虑到各种可能的情况,并提供适当的错误处理和...

    数据结构与算法(JAVA篇)之递归算法

    ### 数据结构与算法(JAVA篇)之递归算法 #### 概念介绍 递归算法是一种常见的编程技术,尤其在解决具有重复子问题的问题时非常有效。递归算法的特点是函数自身调用自身来解决问题的不同部分,直到达到基本情况...

    递归的高级应用java代码

    总结来说,递归是编程中的重要概念,尤其在Java这样的面向对象语言中,它可以优雅地解决复杂问题。通过理解和应用递归,我们可以更好地掌握编程的艺术,而汉诺塔问题的递归解法则是学习这一技巧的一个良好起点。

    tsp递归程序实现(Java).rar_TSP JAVA_TSP递归实现_java递归_tsp_实现tsp

    总结:本文介绍了旅行商问题的基本概念,以及如何使用Java编程语言实现基于递归的解决方案。虽然这种方法在大规模问题上效率较低,但它提供了一个理解问题和递归思想的良好起点。在实际应用中,结合动态规划和其他...

    java m取n 重复 不重复 排列组合 for循环嵌套递归

    根据给定文件的信息,我们可以总结出以下关于Java中m取n排列组合的实现方式,包括重复与不重复的情况,以及如何使用for循环嵌套和递归来实现这些算法。 ### Java中m取n排列组合实现 #### 一、背景介绍 在计算机...

    Java递归例子.docx

    总结来说,递归是一种非常强大的编程技巧,它允许我们通过将问题拆分成更小的子问题来简化问题的解决过程。然而,递归也有其局限性,比如可能导致栈溢出的递归深度问题和效率问题。因此,在使用递归解决问题时,我们...

    递归算法Java实现

    ### 递归算法Java实现 #### 一、递归算法简介 递归是计算机科学中的一个重要概念,指的是一种函数或过程直接或间接地调用自身的行为。在编程语言中,递归通常用来解决那些可以通过更小规模的问题来解决的大问题。...

    Java 跳出递归循环问题解决办法

    总结起来,Java中跳出递归循环的方法主要有两种:一是利用标志变量来控制递归的退出条件,二是通过抛出自定义异常。选择哪种方法取决于具体问题的需求,如递归深度、性能要求以及代码可读性等因素。在实际编程中,应...

    Java递归算法简单示例两则

    Java递归算法简单示例两则 Java递归算法是一种常用的算法设计方法,通过将问题分解为小问题,逐步解决,小问题的解决方法和大问题的解决方法相同,这样可以将复杂的问题简化为简单的问题。Java递归算法广泛应用于...

    java树结构递归里面详细说明

    Java树结构递归详细说明 Java树结构是Java后台常用的数据结构,通过递归写成的。树结构的用法实例包括树目录的总结、函数的参数说明、dtree.js文件的默认图片路径、页面中的书写规则、样式表的使用和页面代码书写的...

Global site tag (gtag.js) - Google Analytics