递归概述
概念:指在当前方法内调用自己的这种现象。
递归的分类:递归分为两种,直接递归和间接)递归。
- 直接递归称为方法自身调用自己
- 间接递归可以A方法调用B方法,B方法调用方法,C方法调用A方法。
注意事项:
- 递归一定要有条件限定,保证递归能够停止下来,否则会发生栈内存溢出。
- 在递归中虽然有限定条件,但是递归次数不能太多,否则也会发生栈内存溢出。
- 构造方法,禁止递归。
假如有方法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); |
| } |
| |
| } |
复制
使用递归来计算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; |
| } |
| } |
复制
递归打印多级目录下的文件
复制 | import java.io.File; |
| |
| public class DemoFileAndDirectory { |
| public static void main(String[] args) { |
| File file = new File("/AAA/BBB/CCC/"); |
| ergodic(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); |
| } |
| |
| |
| |
| |
| |
| 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("不存在该目录"); |
| } |
| } |
| } |
| } |
复制
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 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)