A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

                                                   递归的简介:
递归定义:
       在函数内调用函数本身。
递归注意事项:
       必须在函数内调用该函数本身。
        递归算法所在函数内,必须有函数出口。
        递归次数不能过多,否则会导致内存溢出。
递归的方法调用简单图:
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();
                        }
                }
        }
}

3 个回复

正序浏览
有别的办法吗
回复 使用道具 举报
学习了,写得挺好的
回复 使用道具 举报
写的不太好,大家多多关照a:lol
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马