递归

递归概念

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

递归的分类

  • 递归分为两种,直接递归和间接递归。
  • 直接递归称为方法自身调用自己。
  • 简介递归可以用A方法调用B方法,B方法调用C方法,C方法调用A方法。

注意事项:

  • 递归一定要有条件限定,保证递归能够停止下来,否则会发生栈内存溢出。
  • 在递归中虽然有限定条件,但是递归次数不能太多。否则也会发生栈内存溢出。
  • 构造方法,禁止递归。

递归的使用前提:

当使用方法的时候,方法的主体不变,每次调用方法的参数不同,可以使用递归。

构造方法,禁止递归的原因:

编译报错:构造方法是创建对象使用的,一直递归会导致内存中有无数多个对象,直接导致编译报错。

练习1:使用递归计算1-n之间的和

代码演示:

package day4;

public class Demo01 {
    public static void main(String[] args) {
        int s = sum(3);
        System.out.println(s);
    }

    public static int sum(int n){
        if (n == 1){
            return 1;
        }

        return n + sum(n-1);
    }
}

注意:

使用递归求和,main方法调用sum方法,sum方法会一直调用sum方法。导致在内存中有多个sum方法(频繁的创建方法,调用方法,销毁方法)效率低下。

所以如果仅仅是计算(1-n)之间的和,不建议使用递归,使用for循环即可。

练习2:递归求阶乘

  • 阶乘所有小于及等于该数的正整数的积。

    代码演示:

    package day4;
    
    public class Demo02 {
        public static void main(String[] args) {
            int s = a(5);
            System.out.println(s);
        }
    
        public static int a(int n){
            if (n == 1){
                return 1;
            }
    
            return n * a(n-1);
        }
    }
    

    练习3:递归打印多级目录

    代码演示:

    package day4;
    
    import java.io.File;
    
    public class Demo03 {
        public static void main(String[] args) {
            File file = new File("C:\a");
            getAllFile(file);
        }
    
        public static void getAllFile(File dir){
            File[] files = dir.listFiles();
            for (File f:files){
                if (f.isDirectory()){
                    getAllFile(f);
                    System.out.println(f);
                }else {
                    System.out.println(f);
                }
            }
        }
    }
    

    综合案例:文件搜索

    需求:

    1. 遍历多级文件目录,找出所有文件,打印。
    2. 将文件名转换为字符串,方便判断后缀。
    3. 使用String方法的endWith方法进行判断。

代码演示:

package day4;

import javax.swing.*;
import java.io.File;

public class Demo04 {
    public static void main(String[] args) {
        File file = new File("C:\a");
        getFile(file);
    }

    public static void getFile(File dir){
        File[] files = dir.listFiles();
        for (File f:files) {
            if (f.isDirectory()){
                getFile(f);
            } else {
               String s = f.getName();
               if (s.endsWith(".java")){
                   System.out.println(s);
               }

            }
        }
    }
}
原文地址:https://www.cnblogs.com/Xiaoming0/p/13917163.html