• java 递归


    一 递归的概述

      递归,指在当前方法内调用自己的这种现象

    public void method(){
        System.out.println(“递归的演示”);
        //在当前方法内调用自己
        method();
    }

      递归分为两种,直接递归和间接递归。

      直接递归称为方法自身调用自己。间接递归可以A方法调用B方法,B方法调用C方法,C方法调用A方法。

      递归的代码演示,计算1-n之间的和,使用递归完成

    public class DiGuiDemo {
        public static void main(String[] args) {
            //计算1~num的和,使用递归完成
            int n = 5;
            int sum = getSum(n);
            System.out.println(sum);
            
        }
        public static int getSum(int n) {
            if(n == 1){
                return 1;
            }
            return n + getSum(n-1);
        }
    }

     代码执行流程图解

      递归一定要有条件限定,保证递归能够停止下来,否则会发生栈内存溢出。

      在递归中虽然有限定条件,但是递归次数不能太多。否则也会发生栈内存溢出。

    二 递归打印所有子目录中的文件路径

    编写一个方法用来打印指定目录中的文件路径,并进行方法的调用

    要求:若指定的目录有子目录,那么把子目录中的文件路径也打印出来

    步骤:

    1. 指定要打印的目录File对象

    2. 调用getFileAll()方法

    2.1 获取指定目录中的所有File对象

    2.2 遍历得到每一个File对象

    2.3 判断当前File 对象是否是目录

    判断结果为true,说明为目录,通过递归,再次调用步骤2的getFileAll()方法

    判断结果为false,说明是文件,打印文件的路径

    public class FileDemo2 {
        public static void main(String[] args) {
            File file = new File("d:\test");
            getFileAll(file);
        }
        //获取指定目录以及子目录中的所有的文件
        public static void getFileAll(File file) {
            File[] files = file.listFiles();
            //遍历当前目录下的所有文件和文件夹
            for (File f : files) {
                //判断当前遍历到的是否为目录
                if(f.isDirectory()){
                    //是目录,继续获取这个目录下的所有文件和文件夹
                    getFileAll(f);
                }else{
                    //不是目录,说明当前f就是文件,那么就打印出来
                    System.out.println(f);
                }
            }
        }
    }

    三 搜索指定目录中的.java文件(含子目录)

    需求:打印指定目录即所有子目录中的.java文件的文件路径

    要求:编写一个方法用来打印指定目录中的.java文件路径,并进行方法的调用

    若指定的目录有子目录,那么把子目录中的.java文件路径也打印出来

    步骤:

    1. 指定要打印的目录File对象

    2. 调用getFileAll()方法,传入要打印的目录File对象

    2.1 通过FilenameFilter过滤器获取指定目录中的所有.java类型的File对象

    2.2 遍历得到每一个File对象

    2.3 判断当前File 对象是否是目录

    判断结果为true,说明为目录,通过递归,再次调用步骤2getFileAll()方法

    判断结果为false,说明是文件,打印文件的路径

    测试类

    public class Demo05 {
        public static void main(String[] args) throws IOException {
            File file = new File("E:\io0512");
            gettxtjava(file);
        }
        public static void gettxtjava(File file){
            File[] files =  file.listFiles(new MyFilter());
            for (File f: files) {
                if(f.isDirectory()){
                    gettxtjava(f);
                }else{    
                        System.out.println(f);        
                }
            }
        }
    }

    自定类继承FilenameFilter过滤器接口

    public class MyFilter implements FileFilter {
        @Override
        public boolean accept(File pathname) {
            boolean b =false;        
            
            if(pathname.getName().toLowerCase().endsWith(".java")){
                b= true;
            }
            if(pathname.isDirectory()){
                b= true;
            }
            return b;
        }    
    }    

    四 用递归做斐波那契数列

    题目:最开始有一对兔子,兔子在第三个月及之后的每个月会生一对小兔子,小兔子第三个月及之后每个月也会生一对小兔子

    求一对小兔子在12个月之后有多少对小兔子

    public class Demo02 {
        public static void main(String[] args) {
        System.out.println(tuzi(12));
            }
        }
    public static int tuzi(int a){
            if(a==1){
                return 1;
            }
            if(a==2){
                return 1;
            }
            return tuzi(a-2)+tuzi(a-1);
        }

    五 数组冒泡排序

    public class Demo02 {
        public static void main(String[] args) {
            int[] a = {12,1,25,30,25,100,8,35,47,99,11,4};
            get(a);
            for (int i : a) {
                System.out.println(i);
            }
        }
    }
    public static void get(int[] a){
            int n = 0;
            for (int i = 0; i < a.length-1; i++) {
                for (int j = 0; j < a.length-i-1; j++) {
                    if(a[j]>a[j+1]){
                        n = a[j];
                        a[j] = a[j+1];
                        a[j+1]=n;
                    }
                }
            }
        }

    六 数组快速排序

    public class QuickSort {
        public static void main(String[] args) {
            int[] arr = {12,10,5,25,35,99,1,4,100,78,89,98,3,55};
            QuickS(arr, 0, arr.length-1);
            for (int i : arr) {
                System.out.print(i+"...");
            }
            
        }
        //快速排序
        public static int[]  QuickS(int[] arr,int start,int end){
            int key = arr[start];
            int i = start;
            int j = end;
            while(i<j){
                while(arr[i]<key&&i<j){
                    i++;
                }
                while(arr[j]>key&&i<j){
                    j--;
                }
                if(arr[i]==arr[j]&&i<j){
                    i++;
                    j--;
                }else{
                    int num = arr[i];
                    arr[i] = arr[j];
                    arr[j] = num;
                }
            }
            if(i-1>start){
                arr = QuickS(arr,start,i-1);
            }
            if(j+1<end){
                arr = QuickS(arr,j+1,end);
            }
            return arr;
        }
        }

    七 搜索指定目录中的.java文件(含子目录)工具类

    public class FileFindTool {
        public static List<File> getfiles(File file,String[] filetype){
            //用来存储目录
            List<File> list = new ArrayList<File>();
            File[] files = file.listFiles(new MyFilter(filetype));
            for (File f : files) {
                //当文件类型为文件夹时
                if(f.isDirectory()){
                    //接收返回的list 并添加到总的list里
                    for (File file2 : getfiles(f, filetype)) {
                        list.add(file2);
                    }
                }else{
                    //当文件不为文件夹时
                            list.add(f);                
                    }
                }
            return list;
        }        
    }
    public class MyFilter implements FileFilter {
        private String[] filetype ;
        //写个构造方法用来存储字符串数组
        public MyFilter(String[] filetype){
            this.filetype = filetype;
        }
        public MyFilter(){
        
        }
        public boolean accept(File pathname) {
            boolean b =false;        
            for (String s : filetype) {
                if(pathname.getName().toLowerCase().endsWith(s)){
                    b=true;
                }
            }
            if(pathname.isDirectory()){
                b= true;
            }
            return b;
        }    
    }    
  • 相关阅读:
    Mybaits的10种通用的写法
    你清楚这几个Spring常用注解吗?
    面试时如何介绍自己
    Spring加载加密的配置文件
    MySQL主从复制
    CentOS7安装和配置MySQL
    Druid监控页面配置与使用
    Shiro配置URL过滤
    基于注解的Dubbo服务配置
    Java中常用的加密算法小结
  • 原文地址:https://www.cnblogs.com/jiejava/p/13415065.html
Copyright © 2020-2023  润新知