递归以及递归的简单使用(递归求和、递归求阶乘、递归遍历全目录、递归计算斐波那契数列)

递归,指在当前方法内调用自己的现象。

public void method(){
	System.out.println(“递归的演示”);
	//在当前方法内调用自己
	method();
}

递归分为两种:直接递归(方法自身直接调用自己)和间接递归(可以A方法调用B方法,B方法调用C方法,C方法再调用A方法)。

1.计算1~n的和,使用递归完成

import java.util.Scanner;

public class DiGuiDemo {
	public static void main(String[] args) {
		//计算1~num的和,使用递归完成
		System.out.println("现在计算1~n的和");
		System.out.println("请输入n的值:");
		Scanner in = new Scanner(System.in);
		int n = in.nextInt();
		int sum = getSum(n);
		System.out.println("1~"+n+"的和为:"+sum);
		
	}
	public static int getSum(int n) {
		if(n == 1){
			return 1;
		}
		return n + getSum(n-1);
	}
}

运行结果为:


注意:递归 一定要有条件限定,保证递归能停止,否则会发生栈内存溢出。

          在递归中虽然有限定条件,但是递归次数不能太多,否则也会发生栈内存溢出。

2.递归求阶乘

import java.util.Scanner;

public class DiGuiDemo {
    public static void main(String[] args) {
        System.out.println("请输入n,将计算n的阶乘:");
        Scanner in = new Scanner(System.in);
        int n = in.nextInt();
        System.out.println(n+"!="+getJieCheng(n));
    }
        /* 
     *  计算阶乘 5!
     *   5*4*3*2*1
     */
    public static int getJieCheng(int n){
        if ( n == 1)
            return 1;
        return n * getJieCheng(n-1);
    }
}

运行结果为:

3.递归遍历全目录

import java.io.File;

/*
 *  对一个目录的下的所有内容,进行完全的遍历
 *  使用方法的递归调用
 */
public class FileDemo {
	public static void main(String[] args) {
		File dir = new File("d:\\code");
		getAllDir(dir);
	}
	/*
	 *  定义方法,实现目录的全遍历
	 */
	public static void getAllDir(File dir){
		System.out.println(dir);
		//调用方法listFiles()对目录,dir进行遍历
		File[] fileArr = dir.listFiles();
		for(File f : fileArr){
			//判断变量f表示的路径是不是文件夹
			if(f.isDirectory()){
				//是一个目录,就要去遍历这个目录
				//本方法,getAllDir,就是给个目录去遍历
				//继续调用getAllDir,传递他目录
				getAllDir(f);
			}else{
				System.out.println(f);
			}
		}
	}
}

运行结果为:(得到d盘code文件夹中所有文件及子文件夹中的文件)

4.搜索指定目录中的Java文件(含子目录)

测试类

import java.io.File;

/*
 *  遍历目录,获取目录下的所有.java文件
 *  遍历多级目录,方法递归实现
 *  遍历的过程中,使用过滤器
 */
public class DiGuiDemo {
	public static void main(String[] args) {
		getAllJava(new File("d:\\code"));
	}
	/*
	 * 定义方法,实现遍历指定目录
	 * 获取目录中所有的.java文件
	 */
	public static void getAllJava(File dir){
		//调用File对象方法listFiles()获取,加入过滤器
		File[] fileArr = dir.listFiles(new MyJavaFilter());
		for(File f : fileArr){
			//对f路径,判断是不是文件夹
			if(f.isDirectory()){
				//递归进入文件夹遍历
				getAllJava(f);
			}else{
				System.out.println(f);
			}
		}
	}
}

自定义过滤器接口

import java.io.File;
import java.io.FileFilter;

public class MyJavaFilter implements FileFilter {
	public boolean accept(File pathname) {
		//判断获取的是目录,直接返回true
		if(pathname.isDirectory())
			return true;
		return pathname.getName().toLowerCase().endsWith(".java");
	}

}

运行结果为:(找到d盘code目录中所有.java文件)

4.递归计算斐波那契数列

斐波那契数列指的是这样一个数列:1,1,2,3,5,8,13,21,34,55,89,144,233,377,610,987,1597......

这个数列的第一项和第二项都为1,从第3项开始,每一项都等于前两项之和。

public class DiGuiDemo {
	public static void main(String[] args) {
		System.out.println(getFBNQ(12));
	}
	/*
	 *  方法递归,计算斐波那契数列
	 *  
	 */
	public static int getFBNQ(int month){
		if( month == 1)
			return 1;
		if( month == 2)
			return 1;
		return getFBNQ(month-1)+getFBNQ(month-2);
	}

运行结果为:

猜你喜欢

转载自blog.csdn.net/qq_41787619/article/details/80085319