`

递归的几种用法

阅读更多

以前一直对递归发怵,一想到它就“浑身哆嗦”,但是递归确实是非常精髓和精妙的,有时候处理问题会非常的方便。比如排序,遍历目录下的文件什么的,但是老这么怕他也不是个办法...

先看一个排序的:
现有122345六个数,要求用一个main函数实现所有不同的排序并打印出来,要求:4不能在第三位,3和5不能相连(某公司笔试题)

	public static List list = new ArrayList();
	/**
	 * 构造字符串的所有排序组合
	 * 
	 * @param str
	 *            将要组合成的字符
	 * @param nstr
	 *            源字符串集
	 */
	public static void group(String str, String nstr) {

		if (str.length() != nstr.length()) {// 如果要生产的字符串不等于原字符串的长度
			String rest = getRest(str, nstr);// 调用转换函数,该方法是得到除了当前字符串以后剩下的字符
			for (int i = 0; i < rest.length(); i++) {
				String temp = str + rest.substring(i, i + 1);

				if (temp.indexOf("4") != 2 && temp.indexOf("35") == -1
						&& temp.indexOf("53") == -1) {
					// 过滤显示条件,如果去掉此处的判断,就是列出所有字符集的排列组合

					if (!list.contains(temp) && temp.length() == nstr.length()) {
						System.out.println(temp);
						list.add(temp);
					}
					group(temp, nstr);
				}

			}
		}
	}
	/**
	 * 从源字符串集中去除将要组合成的字符
	 * 
	 * @param str
	 *            将要组合成的字符
	 * @param nstr
	 *            源字符串集
	 * @return 剩余字符串集
	 */
	public static String getRest(String str, String nstr) {

		String rest = "";
		if (str.length() < nstr.length()) {// 如果将要组合的字符串<元字符串的长度
			rest = nstr;// 将原字符串赋给rest
			for (int i = 0; i < str.length(); i++) {
				rest = rest.replaceFirst(str.substring(i, i + 1), "");// 把字符串的第I个替换为""
				// 注意此处的replaceFirst,而不是replaceAll
			}
		}
		return rest;
	}



再就是关于目录结构遍历的了:
static void getDir(String str){

		File f = new File(str);
		

		if(f.isDirectory()){
			File[] files = f.listFiles();
			for(int i=0;i<files.length;i++){
				if(files[i].isDirectory()){
					getDir(files[i].getPath());
					System.out.println("--"+files[i].getPath());
				}
			}
		for(int j=0;j<files.length;j++){
			if(files[j].isFile()){
				System.out.println("   "+files[j].getName());
			}
		}
	}



	public static void main(String[] args) {
		group("", "122345");
		// System.out.println(list.toString());
		getDir("F:\\/jQuery API");
	}



其实递归关键要做好两点吧,第一是要找到递归结束的条件,第二是要组织好递归的调用方法
1
0
分享到:
评论

相关推荐

    几种分形图形的制作,主要是用递归实现的

    本项目探讨了几种通过递归算法实现的分形图形的制作方法,包括分形树、斯宾斯基篓垫(Sierpinski Triangle)、Couch曲线以及分形矩形。这些图形的生成不仅展示了数学的美感,也是计算机图形学领域的重要研究内容。 ...

    java 中的经典递归

    ### Java中的经典递归 #### 一、递归的基本概念 递归是一种常见的算法思想,在计算机科学中占有重要地位。简单来说,递归是指在函数的定义或...在未来的学习和工作中,合理地使用递归将能帮助我们更好地解决问题。

    .net 递归算法 .net 递归算法.net 递归算法

    在.NET编程环境中,递归算法是一种强大的工具,它允许函数或方法调用自身来解决复杂问题。递归的核心思想是将大问题分解为相同或相似的小问题,直到问题变得足够简单,可以直接得出答案。这种解决问题的方式在数据...

    二叉树的构造,递归和非递归的几种遍历

    本文将深入探讨二叉树的构造方法,以及递归和非递归的遍历策略,以帮助读者更好地掌握这一核心概念。 首先,我们来看二叉树的构造。二叉树可以通过两种主要方式创建:前向构造和后向构造。前向构造通常是动态地添加...

    5·5递归算法,递归思想

    递归算法常用于以下几种典型问题: - **阶乘计算**:如计算n!,可以定义递归函数`fact(n)`,当n为1时返回1,否则返回`n * fact(n-1)`。 - **斐波那契数列**:递归地定义F(n)为F(n-1) + F(n-2),其中F(0) = 0,F(1)...

    合并排序递归和非递归算法

    在比较递归和非递归算法时,我们通常关注以下几个方面: 1. **空间效率**:递归算法可能会占用更多的栈空间,因为每次递归调用都会增加栈的深度。而非递归算法则通常需要额外的数据结构来存储待处理的任务。 2. **...

    二分搜索的递归和非递归实现

    非递归方法通常使用循环来代替递归,避免了递归带来的栈空间消耗。非递归实现的基本步骤如下: 1. 初始化左边界为数组起始索引(通常为0),右边界为数组最后一个元素的索引。 2. 当左边界小于或等于右边界时,进入...

    递归图 时间序列重构小波变换_递归图matlab_reconstitution_recurrenceplots_小波变换_递归图

    MATLAB是进行科学计算和数据分析的强大工具,递归图的生成通常涉及以下几个步骤: 1. **相空间重构**:使用延迟嵌入法,如Takens嵌入,选择适当的延时和嵌入维数,将一维时间序列转换为多维状态向量。 2. **设定...

    递归下降分析法

    在递归下降分析中,有几种关键的函数类型: 1. **主解析函数**:通常对应文法的起始符号,它启动整个解析过程。 2. **辅助函数**:对应文法中的其他非终结符,它们被主解析函数或其他辅助函数调用。 3. **终端处理...

    递归下降分析子程序方法实验

    递归下降分析是编译器设计中一种常用的技术,主要用于实现词法分析后的语法分析阶段。这种分析方法基于上下文无关文法(Context-Free Grammar, CFG),特别是使用扩展巴科斯范式(Extended Backus-Naur Form, EBNF)...

    递归代码的写法

    对于二叉树,我们可以实现以下几种递归遍历方法: 1. **前序遍历**:首先访问根节点,然后递归遍历左子树,最后遍历右子树。 2. **中序遍历**:首先递归遍历左子树,然后访问根节点,最后遍历右子树。对于二叉排序...

    程序设计中递归算法

    非递归化的常见方法包括使用迭代结构替代递归调用,或者利用栈手动模拟递归调用过程。 - **使用迭代结构**:通过循环结构(如while循环)来模拟递归过程,避免了递归调用带来的额外开销。 - **手动模拟递归过程**:...

    java详细讲解递归

    虽然递归方法可以使代码更加简洁,但在使用时需要注意以下几点: 1. **性能问题**:递归可能会导致大量的重复计算,从而降低效率。 2. **栈溢出**:如果递归深度过大,可能会导致栈溢出错误。 3. **调试困难**:...

    易语言源码递归算法2.rar

    递归算法指的是函数或过程在执行过程中调用自身的一种方法,通过重复子问题来解决整个问题。这种算法通常涉及树或图的遍历、分治策略以及动态规划等问题。 易语言源码中的递归算法2可能涉及到以下几个方面: 1. **...

    计算递归函数调用次数

    为了避免这种情况,可以考虑使用尾递归(Tail Recursion)、记忆化(Memoization)或迭代(Iteration)等优化方法。 尾递归是指在递归调用的最后返回结果,这样编译器或解释器有可能优化掉多余的栈帧,减少内存消耗...

    递归的解决最近问题

    递归是一种解决问题的方法,它通过调用自身来求解问题。递归通常包含两个基本组成部分:基例(Base Case)和递归步骤(Recursive Step)。基例是递归的终止条件,而递归步骤则是将问题分解为更小规模的子问题,并...

    MySQL多种递归查询方法.docx

    然而,对于递归查询而言,更常用的方法是使用存储过程或者递归临时表。 **示例**: - 创建一个简单的部门表并插入数据。 - 使用存储过程实现递归查询。 **创建部门表**: ```sql DROP TABLE IF EXISTS `dept`; ...

    递归-----动态树实现递归

    递归在处理树结构数据时尤其有效,因为树本身就是一种自相似的数据结构,非常适合使用递归来遍历、查找或修改。标题“递归-----动态树实现递归”暗示我们将探讨如何利用递归方法来操作动态树。 首先,让我们理解...

    c# 递归方法 约瑟夫环

    在C#编程中,我们可以使用递归方法来解决这个问题。递归是一种函数调用自身的技术,它通常用于处理具有自相似性质的问题。约瑟夫环问题就非常适合用递归来解决,因为每次减少一个人后,剩下的问题规模就是一个小得多...

    递归递推的步骤

    递归递推是一种在计算机科学和编程中广泛使用的解决问题的方法,尤其在算法设计和数据结构中扮演着重要角色。在C++中实现递归递推,通常涉及以下几个关键步骤: 1. **定义基本条件**:首先,我们需要确定递归过程的...

Global site tag (gtag.js) - Google Analytics