所谓递归(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);
}
}
最后打印出来的结果如下:
分享到:
相关推荐
递归详解.md
汉诺塔问题c++递归详解
递归算法详解递归算法详解递归算法详解递归算法详解
递归
主要介绍了Java中的递归详解(用递归实现99乘法表来讲解),本文给出了普通的99乘法实现方法和用递归实现的方法,并对比它们的不同,体现出递归的运用及理解,需要的朋友可以参考下
递归调用详解,代码详细讲解了如递归调用以及调用中应该注意的一些问题
递归调用详解,分析递归调用的详细过程[参考].pdf
关于递归相信大家已经熟悉的不能再熟悉了,所以笔者在这里就不多费口舌,不懂的读者们可以在博客园中找到很多与之相关的博客。下面我们直接切入正题,开始介绍尾递归。 尾递归 普通递归和尾递归如果仅仅只是从代码的...
递归算法详解,更详细的理解,欢迎下载哦,谢谢啦,
主要给大家介绍了关于Java中的迭代和递归,文章显示分别介绍了Java中的迭代和递归,而后又介绍了迭代和递归的区别以及数形递归的相关内容,文中介绍的很详细,相信会对大家学习具有一定的参考借鉴价值,有需要的朋友...
递归算法详解 数据结构中一些常用的算法,重点讲述递归算法的实现!!
Python 递归函数 如果一个函数体直接或者间接调用自己,那么这个函数就称为递归函数.也就是说,递归函数体的执行过程中可能会返回去再次调用该函数.在python里,递归函数不需要任何特殊的语法,但是它需要...
python 递归函数详解 课件
递归是编程中经常用到的算法思想,这篇讲义详细的解释了递归的相关用法,参考意义比较强。
java中递归的用法比较单一,但是用途比较重要,在开发中经常用到,熟练掌握递归的用法有利于程序代码的快速合理编写
自己整理的关于全排列的递归程序.本例以数组{a,b,c}三个元素作为例子详细讲解。里面的程序都经过VC6.0运行通过,请读者放心使用
递归算法详解[归纳].pdf
2、递归算法通用解决思路 3、实战演练(从初级到高阶) 4、递归函数调用栈 5、递归算法时间复杂度分析与求解 力争让大家对递归的认知能上一个新台阶,特别会对递归的精华:时间复杂度作详细剖析,会给大家总结...