• Java 递归的简单学习与理解


    递归概述

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

    递归的分类:递归分为两种,直接递归和间接)递归。

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

    注意事项:

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

    假如有方法A,没有限制,不断的递归A方法,那么分配的栈内存中就有无数个A方法,最终导致栈内存溢出。构造方法中不可以递归,因为构造方法是创建对象使用的,一直递归会导致内存中有无数多个对象,直接编译报错。

    使用递归计算1~n之间的和

    public class DemoSum {
        public static void main(String[] args) {
            System.out.println(sum(100));
        }
    
        public static int sum(int n) {
            if (n == 1) {
                return 1;
            }
            return n + sum(n - 1);
        }
    
    }
    控制台输出:
    5050

    使用递归来计算n的阶乘

    public class DemoFactorial {
        public static void main(String[] args) {
            System.out.println(sum(10));
        }
    
        public static int sum(int n) {
            if (n > 1) {
                return n * sum(n - 1);
            }
            return 1;
        }
    }
    控制台输出:
    3628800

    递归打印多级目录下的文件

    import java.io.File;
    
    public class DemoFileAndDirectory {
        public static void main(String[] args) {
            File file = new File("/AAA/BBB/CCC/");
            ergodic(file);
        }
    
        /**
         * 遍历输出文件夹下的的文件,倘若给定的是一个文件,直接输出该文件
         * @param file 文件或文件夹
         */
        public static void ergodic(File file) {
            // 是否存在该目录或文件
            if (file.exists()) {
                // 存在该目录或文件,获取该目录下的所有目录和文件
                File[] files = file.listFiles();
                // 遍历该目录下的文件或目录
                for (File f : files) {
                    // 该目录下,如果是目录,使用递归。如果是文件,直接输出。
                    if (f.isDirectory()) {
                        ergodic(f);
                    } else {
                        System.out.println(f.getAbsolutePath());
                    }
                }
            } else {
                if (file.isFile()) {
                    System.out.println("不存在该文件");
                } else {
                    System.out.println("不存在该目录");
                }
            }
        }
    }
    控制台输出:
    不存在该目录

    递归打印多级目录下的.java文件

    import java.io.File;
    
    public class Demo02FileAndDirectory {
        public static void main(String[] args) {
            File file = new File("/Users/liyihua/IdeaProjects/Study/src/view/study");
            ergodic(file);
        }
    
        /**
         * 遍历输出文件夹下的的.java文件,倘若给定的是一个文件,且是.java为后缀的文件,直接输出该文件
         * @param file 文件或文件夹
         */
        public static void ergodic(File file) {
            // 是否存在该目录或文件
            if (file.exists()) {
                // 存在该目录或文件,获取该目录下的所有目录和文件
                File[] files = file.listFiles();
                // 遍历该目录下的文件或目录
                assert files != null;
                for (File f : files) {
                    // 该目录下,如果是目录,使用递归。如果是文件,直接输出。
                    if (f.isDirectory()) {
                        ergodic(f);
                    } else if (f.getName().endsWith(".java")) {
                        System.out.println(f.getName());
                    }
                }
            } else {
                if (file.isFile()) {
                    System.out.println("不存在该文件");
                } else {
                    System.out.println("不存在该目录");
                }
            }
        }
    }
    控制台输出:
    DemoLinkedHashMap.java
    Demo01MapIteratorKey.java
    Demo01MapKeySet.java
    Demo01MapIteratorKeyValue.java
    Demo01MapGet.java
    Demo01MapRepeat.java
    Demo01MapRemove.java
    Demo01Map.java
    DemoMapPut.java
    MapRepeat.java
    Demo02MapPut.java
    DemoHashTable.java
    Demo01MapEntrySet.java
    Student.java
    Demo01MapContainsKey.java
    Demo01PathSeparator.java
    Demo01File.java
    Demo01FileMethod.java
    Demo06FileMethod.java
    Demo07FileMethod.java
    Demo02FileMethod.java
    Demo05FileMethod.java
    Demo02File.java
    Demo04FileMethod.java
    Demo01Separator.java
    Demo03FileMethod.java
    DemoHashCode.java
    DemoStringHashCode.java
    Demo2HashSet.java
    DemoLinkedHashSet01.java
    DemoStringHashCode1.java
    Demo01PersonHashSet.java
    DemoHashCode1.java
    DemoSetInterface.java
    Person.java
    Person1.java
    DemoHashSet.java
    VariableParameters.java
    DemoLinkedHashSet02.java
    DemoLinkedHashSet.java
    DemoType.java
    DemoUnpack.java
    DemoPackUnpackAutomatic.java
    DemoType2.java
    DemoPack.java
    DemoList.java
    DemoLinkedListAddFirstLast.java
    DemoLinkedListRemoveFirstLast.java
    DemoLinkedListIsEmpty.java
    DemoListAdd.java
    DemoLinkedList.java
    DemoLinkedListGetFirstLast.java
    DemoListSet.java
    DemoLinkedListPushPop.java
    DemoListGet.java
    DemoArrayList.java
    DemoListRemove.java
    Demo01FileAndDirectory.java
    Demo02FileAndDirectory.java
    DemoFactorial.java
    DemoSum.java
    Demo01StringBuilder.java
    DemoStringBuilderToString.java
    DemoStringBuilderAppend.java
    Demo01Calculator.java
    Demo01InvokeCook.java
    Demo02Calculator.java
    Demo02Runnable.java
    Demo01Array.java
    Runnable01Implement.java
    Demo03Runnable.java
    Demo03Calculator.java
    Demo01Runnable.java
    Demo02Array.java
    Cook.java
    Person.java
    Demo01Lambda.java
    Calculator.java
    DemoCollections.java
    Demo02CollectionsSort.java
    Demo01CollectionsSort.java
    DemoCollectionsShuffle.java
    Person.java
    DemoCollectionsAddAll.java
    Comparator.java
    CharNumber.java
    DemoCharNumber.java
    Hero.java
    Skill.java
    Fu.java
    DemoMain1.java
    Demo02InnerClass.java
    Outer1.java
    Body.java
    Demo01InnerClass.java
    Demo01Anonymous.java
    Demo02Anonymous.java
    SkillImplements.java
    InterfaceImplements.java
    Zi.java
    Hero1.java
    DemoMain3.java
    DemoArrayList.java
    DemoMain2.java
    Outer.java
    anonymousInterface01.java
    Weapon.java
    Dog2.java
    Mouse.java
    DemoComputer.java
    DemoCat.java
    Demo01InstanceOf.java
    AbstractAnimal1.java
    Zi01Polymorphism.java
    Fu01Polymorphism.java
    Cat2.java
    Demo01Polymorphism.java
    Keyboard.java
    Fu02Polymorphism.java
    Zi02Polymorphism.java
    Cat1.java
    AbstractAnimal.java
    Demo02Polymorphism.java
    Cat.java
    AbstractAnimal2.java
    Fu03Polymorphism.java
    Zi03Polymorphism.java
    Demo03Polymorphism.java
    GiveMeAnimal.java
    Usb.java
    DemoCat1Dog1.java
    Dog1.java
    Person.java
    Person1.java
    DemoStudent.java
    Student.java
    Demo.java
    DemoPerson.java
    Demo01Final.java
    Demo.java
    Customer.java
    Demo01WaitNotify.java
    Hotel.java
    Demo03WaitNotify.java
    Demo02WaitNotify.java
    Food.java
    WaitWakeMechanism.java
    Demo.java
    MyThread.java
    Demo01MyThread.java
    MovieTicket01.java
    Demo01MovieTicket.java
    Demo01Multithreading.java
    DemoThreadRunnable.java
    MyThread2.java
    Demo01MyThread2.java
    MovieTicket04.java
    Demo01MainThread.java
    MyRunnable.java
    Demo03MovieTicket.java
    Person.java
    Demo04MovieTicket.java
    MovieTicket05.java
    Demo02MainThread.java
    Demo03MyThread.java
    Demo05MovieTicket.java
    Student.java
    MovieTicket02.java
    DemoSimpleThread.java
    MovieTicket03.java
    Demo02MyThread.java
    Demo02MovieTicket.java
    DemoRunnable.java
    FightAgainstLandlords.java
    DemoFightAgainstLandlords.java
    DemoCollectionAdd.java
    DemoCollectionRemove.java
    DemoCollectionSize.java
    DemoCollectionContains.java
    DemoCollectionIsEmpty.java
    DemoCollectionToArray.java
    DemoCollectionClear.java
    DemoForEach.java
    Demo01Iterator.java
    DemoIterator.java
    GenericInterfaceImplement01.java
    Demo03Generic.java
    DemoGenericInterfaceImplement.java
    GenericInterface.java
    GenericInterface01.java
    DemoGenericClass.java
    IteratorArrayList.java
    DemoGenericInterfaceImplement01.java
    GenericClass.java
    Demo02Generic.java
    GenericInterfaceImplement.java
    GenericMethod.java
    Demo04Generic.java
    Demo01Generic.java
    DemoIteratorArrayList.java
    DemoGenericMethod.java
    Fu.java
    Demo01FinallyReturn.java
    DemoArrayException.java
    MyUsersException.java
    Demo02TryCatch.java
    Demo02Throw.java
    DemoFinally.java
    Demo01ManyException.java
    Demo01Throws.java
    Demo01ObjectsNonNull.java
    Demo03Throw.java
    Zi.java
    DemoObjectsNonNull.java
    Demo01Exception.java
    Demo01Throw.java
    Demo01TryCatch.java
    Demo02ThreadPool.java
    Runnable01.java
    Demo01ThreadPool.java
    Demo01Calendar.java
    DemoCalendarAdd.java
    DemoCalendarGet.java
    DemoCalendarSet.java
    DemoCalendarGetTime.java
    InterfacePrivateOne.java
    InterfaceConst.java
    Fu.java
    AbstractInterfaceImplements.java
    InterfaceOne.java
    InterfaceA.java
    InterfaceDefaultImplementsTwo.java
    DemoInterfacePrivate.java
    DemoInterfaceStaticImplements.java
    InterfaceOneTwoImplements.java
    InterfaceOneTwo.java
    DemoInterface.java
    InterfaceDefault.java
    InterfacePrivateOneImplements.java
    InterfaceFormat.java
    Demo1Interface.java
    InterfaceFuZi.java
    AbstractInterfaceFormat.java
    InterfacePrivateTwoImplements.java
    DemoInterfaceDefault.java
    InterfaceStatic.java
    InterfaceImplements.java
    AbstractInterface.java
    DemoInterfaceConst.java
    Zi.java
    InterfaceB.java
    InterfaceStaticImplements.java
    InterfaceDefaultImplementsOne.java
    InterfaceTwo.java
    InterfacePrivateTwo.java
    DemoPersonEquals.java
    Person.java
    Student.java
    DemoObjectEquals.java
    DemoStudentToString.java
    Demo01Date.java
    Demo01FormatMethod.java
    DemoDate2.java
    DemoGetTime.java
    DateFormatAndSimpleDateFormat.java
    Demo01ParseMethod.java
    DemoDate1.java
    DemoDescription.java
    DemoSystemCopyArray.java
    DemoSystemCurrentTimeMillis.java

              

  • 相关阅读:
    逆向学习-内嵌补丁(洞穴代码)
    ubuntu下创建ftp用户,该用户只访问特定目录下的内容
    Ubuntu 14.04 FTP服务器--vsftpd的安装和配置
    Hdu 4223 Dynamic Programming?
    Hdu 3873 Invade the Mars
    Hdu 2025 查找最大元素
    Hdu 1520 Anniversary party
    Hdu 4283 You Are the One
    HTTP协议
    常用正则表达式
  • 原文地址:https://www.cnblogs.com/liyihua/p/12247390.html
Copyright © 2020-2023  润新知