递归:方法中定义调用方法本身。
注意事项:
1、递归一定要有出口,否则就是死循环。
2、递归次数不能太多,否则内存溢出。
3、构造方法不能递归使用。
递归代码简单示例:
public void show(int n){
if(n == 0){
System.exit(0);
//设置程序出口
}
System.out.println(n);
show(--n);
}
JAVA的思想及其图解
那么如何开始写一个递归程序了下面我们就用5的阶乘示范代码来实现:
写代码之前我们针对阶乘递归需要的条件有哪些?
1、首先我们需要一个递归方法:
返回值类型:int
参数列表:int n
2、出口条件:
if(n == 1){return 1};
3、规律:
if (n != 1){return n * 方法名(n - 1)};
具体代码如下:
package com.lj.DiGui;
public class DiGuiDemo {
public static void main(String[] args) {
int n = 5;
System.out.println(jiechen(n));
}
private static int jiechen(int n) {
if (n == 1) {
return 1;
} else {
return n * jiechen(n - 1);
}
}
}
下面我们在针对以上代码做一个图解示例:
假设上图左边为栈内存结构,右边为方法去结构我们可以得到递归的具体操作步骤如上。
下面我们更具递归思想来做一个案例:
有一对兔子,从出生后的第三个月起每个月都生一队兔子,小兔子长到第三个月后每个月又生一对兔子,假设兔子都不死,问第二十个月的兔子对数为多少?
思路分析:
1、递归方法:
返回值类型:int
参数列表:int n
2、出口条件:
if(n ==1 || n==2)return 1;
3、规律:
第三天开始的兔纸数目等于前两天兔纸数目的和。rabbit(n)=rabbit(n-2)+rabbit(n-1);
代码如下:
package com.lj.DiGui;
public class DiGui2 {
public static void main(String[] args) {
int n = 20;
int num = rabbit(n);
System.out.println(num);//一共有6765对兔纸
}
private static int rabbit(int n) {
if (n == 1 || n == 2) {
return 1;
} else {
return (rabbit(n - 2) + rabbit(n - 1));
}
}
}
下面我们再来用递归做一个遍历文件的联系还是继续套用递归思想来做:
1、递归方法:
返回值类型:void
参数列表:File file
2、出口条件:
第一层目录开始遍历直到遍历目标文件夹的问一个文件。
3、规律:
我们对每一层目录进行遍历,同时如果该层目录还存在文件夹的情况,继续进入该文件夹继续进行遍历
代码如下:
package com.lj.DiGui;
import java.io.File;
public class DiGui2 {
public static void main(String[] args) {
File file = new File("/Users/liujing/Desktop/整理");
filelist(file);
}
private static void filelist(File file) {
File[] arrfile = file.listFiles();
// 首先获得第一层目录的说有文件对象
for (File f : arrfile) {
if (f.isDirectory()) {
String filename = f.getAbsolutePath();
// 这里首先拿到该目录的路径
File filenew = new File(filename);
filelist(filenew);
// 对第一层目录遍历,如果发现存在文件夹我们就把他的绝对路径拿到,
// 并且将其设置为新的遍历目录,调用递归方法进行重新遍历
System.out.println(f.getAbsolutePath());
} else {
System.out.println(f.getAbsolutePath());
}
}
}
}
最后得到结果如图: