什么是递归递归
- 递归概述: 当前方法内调用自己的这种现象。
- 递归分类:
1.直接递归:方法自身调用自身。
2.简介递归:A方法调用B方法,B方法调用C方法,C方法调用A方法。 - 递归注意:
1.递归一定要有条件限定,保证递归能够定下来,否则会发生栈内存溢出。
2.在递归中虽然有限定条件,但是递归次数不能太多。否则也会发生栈内存溢出。
3.构造方法禁止递归。
案例:
public class test0 {
public static void main(String[] args) {
System.out.println("ss");
a(1);
//b();
}
//无参构造
public test0(){
/**
* 编译报错;构造方法是创建对象使用的,不能让对象一直创建下去
*/
//test0();
}
/**
* 在递归中虽然有限定条件,但是递归次数不能太多。否则也会发生栈内存溢出。
* 有条件
*/
private static void a(int i){
System.out.println(i);
//添加递归结束条件
if (i==5000){
return;//i=5000结束
}
a(++i);
}
/**
* 递归一定要有条件限定,保证递归能够停止下来,否则会发生栈内存溢出
* 没条件
* 报Exception in thread "main" java.lang.StackOverflowError异常
*/
private static void b(){
System.out.println("b方法");
b();
}
}
递归累加求和
条件: 计算1~n的
public class test1 {
public static void main(String[] args) {
//计算1~num的和,使用递归完成
int num =5;
//调用求和的方法
int sum=getSum(num);
//输出结果
System.out.println(sum);
}
/**
*通过递归实现
* 参数 int 返回值 int
*/
public static int getSum(int num){
/**
* num为1时,方法返回1
*相当于是方法的出口,num总有是1的情况
*/
if(num==1){
return 1;
}
/**
* num不为1时,方法返回 num +(num-1)的累和
* 递归调用getSum方法
*/
return num+getSum(num-1);
}
}
代码详解
递归打印多级目录
分析: 多级目录的打印,就是当目录的嵌套。遍历之前,无从知道到底有多少级目录,所以我们还是要使用递归实现。
public class test2 {
public static void main(String[] args) {
//创建filer对象
File f = new File("G:\\\\aaa");
//调用打印目录方法
println(f);
}
public static void println(File f){
/**
* 获取子文件和目录
*/
File[] files = f.listFiles();
/**
* 循环打印
* 判断:
* 当是文件时,打印绝对路径
* 当是目录时,继续调用打印目录方法,形成递归调用。
*/
for (File file : files) {
//判断
if(file.isFile()){
//是文件,输出文件路径
System.out.println("文件名"+file.getAbsolutePath());
}else {
//是目录,输出目录绝对路径
System.out.println("目录"+file.getAbsolutePath());
//继续遍历形成递归·
println(file);
}
}
}
}