黑马程序员——快速理解Java中的递归

来源:互联网 发布:2016淘宝小号直销商 编辑:程序博客网 时间:2024/06/06 06:17


递归的简介

递归定义:

在函数内调用函数本身。

递归注意事项:

必须在函数内调用该函数本身。

递归算法所在函数内,必须有函数出口。

递归次数不能过多,否则会导致内存溢出。

递归的方法调用简单图:

 

最常见的递归思路及代码实现:

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();

}

}

}

}

 

 

0 0
原创粉丝点击