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("不存在该目录");
}
}
}
}
复制
控制台输出所有后缀名为java的文件
posted @   LeeHua  阅读(578)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· winform 绘制太阳,地球,月球 运作规律
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 上周热点回顾(3.3-3.9)
点击右上角即可分享
微信分享提示

目录导航