`

递归详解

 
阅读更多

      所谓递归(Recursion),就是方法调用自身,对于递归来说,一定有一个出口,让递归结束,只有这样才能保证不出现死循环。编写一个递归程序,应先想出口点。

1,下面使用阶乘这个数学概念来实践一下阶乘。

 阶乘指从1乘以2乘以3乘以4一直乘到所要求的数。

 例如所要求的数是4,则阶乘式是1×2×3×4,得到的积是24,24就是4的阶乘。 

 下面的代码就是使用递归来实现阶乘---不断地调用number方法,注:下例暂不考虑负数

package com.test.Algorithm;

public class Factorial {
	public static int number(int i){
		if(i == 1 || i == 0){   //递归的出口
			return 1;
		}else{
			return i * number(i-1);
		}
	}
	public static void main(String[] args) {
		System.out.println(number(4));
	}
}

 

2,再来看一个使用递归计算斐波那契数列的例子:

斐波那契数列指的是这样一个数列:1、1、2、3、5、8、13、21、……

这个数列从第三项开始,每一项都等于前两项之和。

package com.test.Algorithm;

public class Fab {
	//使用递归计算斐波那契数列
	public static int compute(int i){
		//递归的出口
		if(i == 1 || i == 2){
			return 1;
		}else{
			return compute(i-1) + compute(i-2);
		}
	}
	public static void main(String[] args) {
		System.out.println(compute(9));
	}
}

 

 3,下面再使用递归来删除一个文件夹内的所有文件

package com.test.Algorithm;

import java.io.File;

public class FileTest9 {

	public static void delAll(File file){
		//递归出口,判断是否文件或空文件夹
		if(file.isFile() || file.list().length == 0){
			file.delete();
		}else{
			File[] files = file.listFiles();
			for(File f: files){
				delAll(f);
			}
			file.delete();
		}
	}
	
	public static void main(String[] args) {
		File file = new File("D:/test");
		delAll(file);
	}

}

 

4,给定任意一个目录,以树形方式展示出该目录的所有子目录与文件,另外,在展现的时候,将目录排在上面,文件排在下面,每一层要加上缩进,以递归实现。

package com.test.Algorithm;

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

public class FileTest11 {

	private static int time = 0;

	public static void deepList(File file) {
		if (file.isFile() || file.list().length == 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());
					output.append("\\");// "\"表示是目录
				}
				System.out.println(output);
				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]);
	}

	private static String getTabs(int times) {
		StringBuffer buffer = new StringBuffer();
		for (int i = 0; i < times; i++) {
			buffer.append("\t");
		}
		return buffer.toString();
	}

	public static void main(String[] args) throws IOException {
		File f = new File("C:/test");
		deepList(f);
	}

}

 

最后打印出来的结果如下:

分享到:
评论

相关推荐

    汉诺塔问题c++递归详解

    "汉诺塔问题C++递归详解" 汉诺塔问题是一个经典的递归问题,它的解决方案可以使用C++语言来实现。在这个问题中,我们需要将一些圆盘从起始柱移到目标柱,规则是小圆盘不能放在大圆盘上,并且每次只能移动一个圆盘。...

    递归详解.md

    递归详解.md

    C or C++函数递归详解

    本文介绍了C语言中函数递归的概念和应用。函数递归是指一个函数在执行过程中调用自身的过程,可以帮助解决一些复杂的问题,如计算阶乘、斐波那契数列等。文章通过实例代码详细讲解了函数递归的实现方式和注意事项,...

    程序员必备的基本算法:递归详解.pdf

    在IT行业中,算法是程序员解决问题的关键工具之一,而递归是算法中的一种重要概念。递归是指函数或程序调用自身的过程,它通常用于解决具有相同结构的问题子集。理解并掌握递归对于任何程序员来说都是必备技能。 ...

    递归调用详解,分析递归调用的详细过程

    递归调用详解,代码详细讲解了如递归调用以及调用中应该注意的一些问题

    java详细讲解递归

    ### Java中的递归详解 #### 一、递归的基本概念 在Java编程语言中,递归是一种非常重要的算法思想和技术手段。递归是指一个方法直接或间接地调用自身的过程。这种自我调用的方式可以用来解决很多复杂的问题,并且...

    递归调用详解,分析递归调用的详细过程[参考].pdf

    "递归调用详解" 递归调用是软件开发中一个重要的概念,它是函数实现的一个很重要的环节,许多程序中都或多或少的使用了递归函数。递归的意思就是函数自己调用自己本身,或者在自己函数调用的下级函数中调用自己。...

    C#函数式编程中的递归调用之尾递归详解

    关于递归相信大家已经熟悉的不能再熟悉了,所以笔者在这里就不多费口舌,不懂的读者们可以在博客园中找到很多与之相关的博客。下面我们直接切入正题,开始介绍尾递归。 尾递归 普通递归和尾递归如果仅仅只是从代码的...

    dom4j解析 递归

    **DOM4J解析递归详解** DOM4J是Java中一个强大的XML处理库,它提供了丰富的API用于XML的解析、创建、操作以及遍历。在处理复杂的XML文档时,经常需要用到递归方法来深入到XML的各个层级进行访问。本文将深入探讨DOM...

    Java中的迭代和递归详解

    Java中的迭代和递归是两种不同的编程方法,用于解决问题或执行任务。这两种方法都有各自的优点和缺点,适用于不同的场景。 **一、递归** 递归是一种函数自我调用的技术,通常涉及将大问题分解为相同或相似的子问题...

    Java中的递归详解(用递归实现99乘法表来讲解)

    在编程领域,递归是一种强大的工具,它允许函数或方法通过调用自身来解决问题。Java中的递归在处理复杂问题时特别有用,本篇将详细解释如何使用递归来实现99乘法表,并与传统的for循环实现进行对比。 首先,让我们...

    Java 零基础方法递归.md

    ### Java零基础方法递归详解 #### 一、引言 在计算机科学中,递归是一种重要的编程思想,尤其在解决复杂问题时有着不可替代的作用。对于初学者来说,掌握递归不仅能提升编程能力,还能培养逻辑思维能力。本文将...

    数据结构 递归算法详解

    在编程领域,递归算法是一种强大的工具,尤其在数据结构的处理中发挥着重要作用。递归算法基于函数自我调用的原理,通过不断分解问题来达到解决问题的目的。它能够简化复杂问题的解决逻辑,但同时也可能带来性能上的...

    递归算法详解.pdf

    递归算法是一种重要的程序设计思想,它在解决数学问题和计算机科学中有着广泛的应用。递归算法的原理是将一个大问题分解成小问题,通过解决小问题来解决大问题,这种方法与数学归纳法有异曲同工之妙。在计算机科学中...

    递归算法详解[归纳].pdf

    递归算法是一种在软件开发中常用的技术,其核心在于函数直接或间接地调用自身来解决问题。递归算法的实现依赖于运行时堆栈,每次函数调用都会在堆栈上分配空间来保存局部变量和返回地址。在这个过程中,每次递归调用...

    Python 递归函数详解及实例

    Python 递归函数 如果一个函数体直接或者间接调用自己,那么这个函数就称为递归函数.也就是说,递归函数体的执行过程中可能会返回去再次调用该函数.在python里,递归函数不需要任何特殊的语法,但是它需要...

    递归算法的详解,各种常见递归算法

    递归算法是一种强大的编程技术,它通过函数或过程在解决问题时调用自身来解决更小规模的相同问题。递归的基本概念在于一个函数在定义中包含对自身的引用,或者问题的解决方案依赖于较小规模问题的解决方案。在程序...

    浅析 语言递归

    ### 语言递归详解 #### 一、递归的基本概念 递归作为一种经典的算法,在程序设计领域占有举足轻重的地位。它不仅让程序结构更加清晰、易于理解,还能简化某些看似复杂的问题。然而,递归也有其难点所在,尤其是...

    关于尾递归的使用详解

    **尾递归详解** 尾递归(Tail Recursion)是一种特殊的递归形式,它是递归概念的一个子集,主要用于优化递归算法。普通递归在执行过程中会不断积累调用栈,随着递归深度的增加,内存消耗也会急剧增大,可能导致栈...

Global site tag (gtag.js) - Google Analytics