递归的简介:
递归定义:
在函数内调用函数本身。
递归注意事项:
必须在函数内调用该函数本身。
递归算法所在函数内,必须有函数出口。
递归次数不能过多,否则会导致内存溢出。
递归的方法调用简单图:
C:\Users\xue\Desktop\0315jva培训资料\day20\code
最常见的递归思路及代码实现:
1:使用递归求1-10的和
package cn.itcast;
/*
* 递归:将复杂问题分解,即复杂问题简单化。
* 使用递归求1-10的和。
* 10 + 1-9的和
* 9 + 1-8的和
* 8+ 1-7的和
* ...
* 3+ 1-2和
* 2+ 1的和
* 1 返回1
*/
public class Test {
public static void main(String[] args) {
System.out.println(getSum(3));
}
//获取1到指定数字的和
public static int getSum(int number) {
//递归出口:如果加到1了,则返回1。
if(number==1) {
return 1;
//如果不是1,就使用这个数,加上:1——比它小1的数的和。
}else {
int nextNumber = number-1;
return number + getSum(nextNumber);
}
}
}
2:使用递归完成5的阶乘
package cn.itcast;
/*
* 递归:将复杂问题分解,即复杂问题简单化。
* 使用递归求5的阶乘。
* 5*4!
* 4*3!
* ...
* 1!
*/
public class Test2 {
public static void main(String[] args) {
System.out.println(getSum(5));
}
//获取1到指定数字的积
public static int getSum(int number) {
//递归出口:如果加到1了,则返回1。
if(number==1) {
return 1;
//如果不是1,就使用这个数,加上:1——比它小1的数的和。
}else {
int nextNumber = number-1;
return number * getSum(nextNumber);
}
}
}
3:使用递归计算斐波那契数列
package cn.itcast;
/*
* 使用递归计算斐波那契数列
* 结果: 1 1 2 3 5 8 13 21...
* number: 1 2 3 4 5 6 7 8...
* 计算到第几个数时,那个数是多少
*/
public class Test3 {
public static void main(String[] args) {
System.out.println(method(7));
}
//这个方法到底是干什么的?给我第几个数,我给你返回这一个数的值。!!!!
public static int method(int number) { //number:第几个数
if(number == 1||number == 2) {//如果是前两个数,就返回1
return 1;
} else {
int before = number-1; //得到前一个数是第几个数
int beforeBefore = number-2; //得到前一个数的前一个数是第几个数
return method(before) + method(beforeBefore); //拿到前一个数的值,拿到前一个数的前一个数的值,相加,得到这个数。
}
}
}
4:递归输出指定目录下所有java文件的绝对路径
package cn.itcast;
import java.io.File;
/*
* 递归输出指定目录下所有java文件的绝对路径,
* 如果文件夹中还包括文件夹需要继续获取,
* 直到最后一级,只有文件
*/
public class Test5 {
public static void main(String[] args) {
File file = new File("src");
method(file);
}
public static void method(File dir) {
File[] listFiles = dir.listFiles();
for (File fileorDir : listFiles) {
//如果是文件夹,就继续判断下一级文件夹
if(fileorDir.isDirectory()) {
System.out.println("dir:"+fileorDir.getName());
method(fileorDir);
} else { //如果是文件,就直接获取
if(fileorDir.getName().endsWith(".java")) //判断文件名是否以.java结尾
System.out.println(fileorDir.getAbsolutePath());
}
}
}
}
5:递归删除指定文件夹
package cn.itcast;
import java.io.File;
/*
* 递归删除指定文件夹,
* 需要一级一级的删除,直到里边的文件都删除了,
* 然后在删除文件夹,最后删除自己
*/
public class Test6 {
public static void main(String[] args) {
File dir = new File("a");
method(dir);
}
public static void method(File dir) {
//先删除内容
//返回该目录下所有的文件及文件夹对象
File[] listFiles = dir.listFiles();
for (File fileorDir : listFiles) {
if(fileorDir.isDirectory()) {
//删除这个文件夹
method(fileorDir);
}else {
//直接删除这个文件
System.out.println(fileorDir.getName());
fileorDir.delete();
}
}
//删除我自己
System.out.println(dir.getName());
dir.delete();
}
}
6:复制多级文件夹内容
package cn.itcast2;
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
/*
* 复制多级文件夹内容
*/
public class Test3 {
public static void main(String[] args) throws IOException {
File srcDir = new File("src");
File destDir = new File("abc");
method(srcDir,destDir);
}
public static void method(File src,File dest) throws IOException{
//遍历该目录下所有的文件及文件夹对象
File[] list = src.listFiles();
//将该目录下所有内容,一次迭代
for (File fileorDir : list) {
//如果是文件夹
if(fileorDir.isDirectory()) {
//根据老文件夹,创建新文件夹
File oldDir = fileorDir;
File newDir = new File(dest,oldDir.getName());
newDir.mkdir();
//将老文件夹内容复制到新文件夹中
method(oldDir,newDir);
} else { //如果是文件
//将老文件,复制到新文件中
File oldFile = fileorDir;
File newFile = new File(dest,oldFile.getName());//!!!!!!!如何找到目标文件的文件对象
//创建拷贝动作需要的输入输出流
BufferedInputStream bis = new BufferedInputStream(new FileInputStream(oldFile));
BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(newFile));
//拷贝
byte[] bytes = new byte[1024];
int len;
while((len=bis.read(bytes))!=-1) {
bos.write(bytes, 0, len);
}
//关闭流
bos.close();
bis.close();
}
}
}
}
|
|