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

          

原文地址:https://www.cnblogs.com/liyihua/p/12247390.html