以前一直对递归发怵,一想到它就“浑身哆嗦”,但是递归确实是非常精髓和精妙的,有时候处理问题会非常的方便。比如排序,遍历目录下的文件什么的,但是老这么怕他也不是个办法...
先看一个排序的:
现有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");
}
其实递归关键要做好两点吧,第一是要找到递归结束的条件,第二是要组织好递归的调用方法
分享到:
相关推荐
本项目探讨了几种通过递归算法实现的分形图形的制作方法,包括分形树、斯宾斯基篓垫(Sierpinski Triangle)、Couch曲线以及分形矩形。这些图形的生成不仅展示了数学的美感,也是计算机图形学领域的重要研究内容。 ...
### Java中的经典递归 #### 一、递归的基本概念 递归是一种常见的算法思想,在计算机科学中占有重要地位。简单来说,递归是指在函数的定义或...在未来的学习和工作中,合理地使用递归将能帮助我们更好地解决问题。
在.NET编程环境中,递归算法是一种强大的工具,它允许函数或方法调用自身来解决复杂问题。递归的核心思想是将大问题分解为相同或相似的小问题,直到问题变得足够简单,可以直接得出答案。这种解决问题的方式在数据...
本文将深入探讨二叉树的构造方法,以及递归和非递归的遍历策略,以帮助读者更好地掌握这一核心概念。 首先,我们来看二叉树的构造。二叉树可以通过两种主要方式创建:前向构造和后向构造。前向构造通常是动态地添加...
递归算法常用于以下几种典型问题: - **阶乘计算**:如计算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是进行科学计算和数据分析的强大工具,递归图的生成通常涉及以下几个步骤: 1. **相空间重构**:使用延迟嵌入法,如Takens嵌入,选择适当的延时和嵌入维数,将一维时间序列转换为多维状态向量。 2. **设定...
在递归下降分析中,有几种关键的函数类型: 1. **主解析函数**:通常对应文法的起始符号,它启动整个解析过程。 2. **辅助函数**:对应文法中的其他非终结符,它们被主解析函数或其他辅助函数调用。 3. **终端处理...
递归下降分析是编译器设计中一种常用的技术,主要用于实现词法分析后的语法分析阶段。这种分析方法基于上下文无关文法(Context-Free Grammar, CFG),特别是使用扩展巴科斯范式(Extended Backus-Naur Form, EBNF)...
对于二叉树,我们可以实现以下几种递归遍历方法: 1. **前序遍历**:首先访问根节点,然后递归遍历左子树,最后遍历右子树。 2. **中序遍历**:首先递归遍历左子树,然后访问根节点,最后遍历右子树。对于二叉排序...
非递归化的常见方法包括使用迭代结构替代递归调用,或者利用栈手动模拟递归调用过程。 - **使用迭代结构**:通过循环结构(如while循环)来模拟递归过程,避免了递归调用带来的额外开销。 - **手动模拟递归过程**:...
虽然递归方法可以使代码更加简洁,但在使用时需要注意以下几点: 1. **性能问题**:递归可能会导致大量的重复计算,从而降低效率。 2. **栈溢出**:如果递归深度过大,可能会导致栈溢出错误。 3. **调试困难**:...
递归算法指的是函数或过程在执行过程中调用自身的一种方法,通过重复子问题来解决整个问题。这种算法通常涉及树或图的遍历、分治策略以及动态规划等问题。 易语言源码中的递归算法2可能涉及到以下几个方面: 1. **...
为了避免这种情况,可以考虑使用尾递归(Tail Recursion)、记忆化(Memoization)或迭代(Iteration)等优化方法。 尾递归是指在递归调用的最后返回结果,这样编译器或解释器有可能优化掉多余的栈帧,减少内存消耗...
递归是一种解决问题的方法,它通过调用自身来求解问题。递归通常包含两个基本组成部分:基例(Base Case)和递归步骤(Recursive Step)。基例是递归的终止条件,而递归步骤则是将问题分解为更小规模的子问题,并...
然而,对于递归查询而言,更常用的方法是使用存储过程或者递归临时表。 **示例**: - 创建一个简单的部门表并插入数据。 - 使用存储过程实现递归查询。 **创建部门表**: ```sql DROP TABLE IF EXISTS `dept`; ...
递归在处理树结构数据时尤其有效,因为树本身就是一种自相似的数据结构,非常适合使用递归来遍历、查找或修改。标题“递归-----动态树实现递归”暗示我们将探讨如何利用递归方法来操作动态树。 首先,让我们理解...
在C#编程中,我们可以使用递归方法来解决这个问题。递归是一种函数调用自身的技术,它通常用于处理具有自相似性质的问题。约瑟夫环问题就非常适合用递归来解决,因为每次减少一个人后,剩下的问题规模就是一个小得多...
递归递推是一种在计算机科学和编程中广泛使用的解决问题的方法,尤其在算法设计和数据结构中扮演着重要角色。在C++中实现递归递推,通常涉及以下几个关键步骤: 1. **定义基本条件**:首先,我们需要确定递归过程的...