递归以及递归的简单使用(递归求和、递归求阶乘、递归遍历全目录、递归计算斐波那契数列)
递归,指在当前方法内调用自己的现象。
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);
}
运行结果为:
还没有评论,来说两句吧...