递归
递归是方法本身调用方法的一种现象
Math类中有一个方法max()求最大值
1.方法嵌套不属于递归
Math.max(Math.max(10,20),30):方法嵌套
2.方法递归的条件:
1)必须定义方法
2)要有出口条件
3)寻找规律
3.递归可以用在构造方法上,但不能用在成员方法上
举例:
package digui;
/*
* 求5的阶乘
* 5!=5*4*3*2*1
* 5!=5*4!
* 方式一:for循环
* 方式二:递归
*/
public class DiGuiDemo {
public static void main(String[] args) {
//for循环
int jc=1;
for(int x=5;x>0;x--){
jc*=x;
}
System.out.println("5的阶乘是:"+jc);
System.out.println("--------------");
System.out.println(jieCheng(5));
}
//递归
//1)定义一个方法
private static int jieCheng(int n) {
//出口条件
if(n==1){
return 1;
}else{
return n*jieCheng(n-1);
}
}
}
4.练习,子生孙孙生子
package digui;
/*
* 有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后
* 每个月又生一对兔子,假如兔子都不死,问第二十个月的兔子对数为多少?(不死神兔)
* 分析:找兔子对数的规律:
* 兔子生长分三个周期,
* 幼年,青年,老年 共计
* 第1月 1 0 0 1
* 第2月 0 1 0 1
* 第3月 1 0 1 2
* 第4月 1 1 1 3
* 第5月 2 1 2 5
* 第6月 3 2 3 8
* 第7月 5 3 5 13
* 第8月 8 5 8 21
* 兔子的总数分别为1,1,2,3,5,8,13,21.......
* 即从第三个月起,后面的兔子总数都等于前面两个月的兔子总数之和
*/
public class DiGuiDemo2 {
public static void main(String[] args) {
//方法一:for循环
//定义一个数组
int[] arr=new int[20];
arr[0]=1;
arr[1]=1;
for(int x=2;x<arr.length;x++){
arr[x]=arr[x-1]+arr[x-2];
System.out.println("第"+x+"个月的兔子对数是:"+arr[x]);
}
System.out.println("------");
System.out.println(fanZhi(20));
}
//方法二:递归
private static int fanZhi(int n) {
if(n==1||n==2){
return 1;
}else{
return fanZhi(n-1)+fanZhi(n-2);
}
}
}
5.递归删除带目录的内容
import java.io.FileWriter;
import java.io.IOException;
/*
* 删除Demo文件夹下带内容的目录
* 1)将Demo文件封装成一个File对象
* 2)采用递归删除,定义一个方法
* 3)获取当前目录下所有的文件以及文件夹的File数组
* 4)给File数组做非空判断
* 遍历file数组,获取到每一个file对象
* 判断是否是文件夹,是,返回2)继续删除,不是,直接删除
*
*/
public class DiGuiDemo3 {
public static void main(String[] args) throws IOException {
File file=new File("Demo\\aaa\\bbb");
file.mkdirs();
File file2=new File(file,"a.txt");
file2.createNewFile();
BufferedWriter bw=new BufferedWriter(new FileWriter(file2));
bw.write("this is a txt");
bw.flush();
bw.close();
File scrfile =new File("Demo");
delete(scrfile);
}
private static void delete(File scrfile) {
// TODO Auto-generated method stub
//获取Demo文件夹下的所有文件以及文件夹的File数组
File[]arrfile=scrfile.listFiles();
for(File f:arrfile){
//判断是否是文件夹
if(f.isDirectory()){
//是,继续返回去删除
delete(f);
}else{
//否则直接删除文件
System.out.println(f.getName()+","+f.delete());
}
}
}
}
6.递归输出绝对路径
* 需求:把d:\develop目录下所有的java结尾的文件的绝对路径给输出在控制台。
* 1)封装目录
* 2)递归,定义一个方法,获取当前目录下的所有文件以及文件夹的File数组
* 3)对File数组做非空判断
* 4)增强for遍历,获取到每一个file对象
* 判断是否是一个文件夹
* 是:返回,继续回到2)
* 不是:
* 判断文件是否以.java结尾
* 是:直接输出
* 不是,不搭理
*/
public class DiGuiDemo4 {
public static void main(String[] args) {
File scrFoler=new File("d:\\develop");
getAllFile(scrFoler);
}
private static void getAllFile(File scrFoler) {
File[]arrayFile=scrFoler.listFiles();
if(arrayFile!=null){
for(File f:arrayFile){
if(f.isDirectory()){
getAllFile(f);
}else{
if(f.getName().endsWith(".java")){
System.out.println(f.getAbsolutePath());
}
}
}
}
}
}
* 需求:把d:\develop目录下所有的java结尾的文件的绝对路径给输出在控制台。
* 1)封装目录
* 2)递归,定义一个方法,获取当前目录下的所有文件以及文件夹的File数组
* 3)对File数组做非空判断
* 4)增强for遍历,获取到每一个file对象
* 判断是否是一个文件夹
* 是:返回,继续回到2)
* 不是:
* 判断文件是否以.java结尾
* 是:直接输出
* 不是,不搭理
*/
public class DiGuiDemo4 {
public static void main(String[] args) {
File scrFoler=new File("d:\\develop");
getAllFile(scrFoler);
}
private static void getAllFile(File scrFoler) {
File[]arrayFile=scrFoler.listFiles();
if(arrayFile!=null){
for(File f:arrayFile){
if(f.isDirectory()){
getAllFile(f);
}else{
if(f.getName().endsWith(".java")){
System.out.println(f.getAbsolutePath());
}
}
}
}
}
}