1.递归的概述
方法定义中调用方法本身出现的现象。
2.递归的注意事项
要有出口,否则就是死递归。
次数不能太多,否则就栈内存溢出。
构造方法不能递归使用。
3.递归的求阶乘
package cn;
/**
* 递归
*
* 求5的阶乘
*
*/
public class DiGuiDemo {
public static void main(String[] args) {
int jc = 1;
for (int i = 1; i <= 5; i++) {
jc *= i;
}
System.out.println("5的阶乘是:"+jc);
}
}
package cn;
/**
* 递归
*
* 求5的阶乘
*
*/
public class DiGuiDemo {
public static void main(String[] args) {
int jc = 1;
for (int i = 1; i <= 5; i++) {
jc *= i;
}
System.out.println("5的阶乘是:"+jc);
System.out.println("5的阶乘:"+jiecheng(5));
}
/**
* 递归调用
* @param n
* @return
*/
public static int jiecheng(int n){
if(n == 1){
return 1;
}
return n*jiecheng(n-1);
}
}
4.不死神兔问题
数组实现
package cn;
/**
* 有一对兔子,从出生后第3个月开始每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子 ,假如兔子不死,那么第二十个月有多少只兔子
* 兔子对数
* 第一个月 1
* 第二个月 1
* 第三个月 2
* 第四个月 3
* 第五个月 5
* ...
*
* 由此可见兔子的数量是
* 1 1 2 3 5 8 ...
*/
public class DiGuiDemo2 {
public static void main(String[] args) {
//定义一个数组
int[] arr = new int[20];
arr[0] = 1;
arr[1] = 1;
for(int x = 2;x<arr.length;x++){
arr[x] = arr[x-2] + arr[x-1];
}
System.out.println("第二十个月的兔子总数是:"+arr[arr.length-1]);
}
}
第二十个月的兔子总数是:6765
变量的变化实现
假如相邻的两个月的兔子对数是a,b
第一个相邻的数据:a=1,b=1
第一个相邻的数据:a=1,b=2
第一个相邻的数据:a=2,b=3
第一个相邻的数据:a=3,b=5
下一次的a是以前的b,下一次的b是以前的a+b
int a = 1;
int b = 1;
for(int x = 0;x<18;x++){
//临时遍历存储上一次的a
int temp = a;
a = b;
b = temp + b;
}
System.out.println("第二十个月的兔子总数是:"+b);
第二十个月的兔子总数是:6765
递归实现
package cn;
/**
* 有一对兔子,从出生后第3个月开始每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子 ,假如兔子不死,那么第二十个月有多少只兔子
* 兔子对数
* 第一个月 1
* 第二个月 1
* 第三个月 2
* 第四个月 3
* 第五个月 5
* ...
*
* 由此可见兔子的数量是
* 1 1 2 3 5 8 ...
*/
public class DiGuiDemo2 {
public static void main(String[] args) {
System.out.println("第二十个月的弟子总数是:"+fib(20));
}
//递归实现
public static int fib(int n){
if(n ==1 || n==2){
return 1;
}
return fib(n-1) + fib(n-2);
}
}
第二十个月的兔子总数是:6765
5.获取指定目录下的.java文件的绝对路径
package cn;
import java.io.File;
/**
* 需求:输出D:\MyEclipse2016\workspace\JavaSE下的所有以java结尾的文件的绝对路径
* 分析
* 1.封装目录
* 2.获取该目录下所有的文件或者文件夹的File数组
* 3.遍历该File数组,得到每一个File对象
* 4.判断该File对象是否是文件夹
* 是:回到2
* 否:继续判断是否以.java结尾
* 是:就输出该文件的绝对路径
* 否:就随他去
*/
public class DiGuiDemo3 {
public static void main(String[] args) {
//封装目录
File srcFolder = new File("D:\\MyEclipse2016\\workspace\\JavaSE");
//递归功能实现
getAllJavaFilePaths(srcFolder);
}
private static void getAllJavaFilePaths(File srcFolder) {
//获取该目录下所有的文件或者文件夹的File数组
File[] fileArray = srcFolder.listFiles();
//遍历该File数组,得到每一个File对象
for(File file :fileArray){
//判断该File对象是否是文件夹
if(file.isDirectory()){
getAllJavaFilePaths(file);
}else{
if(file.getName().endsWith(".java")){
System.out.println(file.getAbsolutePath());
}
}
}
}
}
6.递归删除带内容的目录
package cn;
import java.io.File;
/**
* 递归删除带内容的目录
* 分析:
* 1.封装目录
* 2.获取该目录下的所有文件或者文件夹的File数组
* 3.遍历该File数组,得到每一个File对象
* 4.判断该File对象是否是文件夹
* 是:回到2
* 否:就删除
*
*/
public class FileDeleteDemo {
public static void main(String[] args) {
//封装目录
File srcFolder = new File("demo");
//递归实现
deleteFolder(srcFolder);
}
private static void deleteFolder(File srcFolder) {
//获取该目录下的所有文件或者文件夹的File数组
File[] fileArray = srcFolder.listFiles();
//遍历该File数组,得到每一个File对象
for(File file :fileArray){
//.判断该File对象是否是文件夹
if(file.isDirectory()){
deleteFolder(file);
}else{
System.out.println(file.getName()+"--"+file.delete());
}
}
//删除完所有文件之后,可以将文件夹删除
System.out.println(srcFolder.getName()+"---"+srcFolder.delete());
}
}
谨慎使用
转载于:https://blog.51cto.com/11841428/1864753