学习笔记--Java中方法递归调用
Java中方法递归调用
public class RecursionTest01{
public static void main(String[] args){
System.out.println("main begin");
// 调用doSome方法
doSome();
System.out.println("main over");
}
public static void doSome(){
System.out.println("main begin");
doSome(); // 调用方法自身
System.out.println("main over");
}
}
- 在上面的代码中
doSome的代码片段只有一份public static void doSome(){
System.out.println("main begin");
doSome(); // 这块代码不结束,下一行代码不执行
System.out.println("main over");
}
- 只要调用
doSome方法就会在栈内存中新分配一块所属内存空间 - 上述程序会产生一个错误【不是异常,是错误
Error】- java.lang.StackOverflowError
- 栈内存溢出错误
- 错误发生无法挽回,只有一个结果,就是 JVM 停止工作
方法递归的使用
什么是递归?
方法自身调用自身
a(){
a();
}
递归是很耗费栈内存的,递归算法能不用就尽量不用
递归必须有结束条件,不然必定会发生栈内存溢出错误
递归即使有结束条件,但也可能发生栈内存溢出错误,因为递归的太深了
public class RexursionTest{
public static void main(String[] args){
int num = 4;
System.out.println("sum: " + sum(num));
System.out.println("rexursionSum: " + rexursionSum(num));
}
// 求 1~N 的和
public static int sum(int num){
int result = 0;
for(int i = 1; i <= num; i++){
result += i;
}
return result;
}
// 使用递归,求 1~N 的和
public static int rexursionSum(int num){
if (num == 1){
return 1;
}
return num + rexursionSum(num - 1);
}
}
结果:
sum: 10
rexursionSum: 10
感受递归:
public class RexursionTest{
public static void main(String[] args){
int num = 4;
System.out.println("------------\nsum: " + sum(num));
}
// 使用递归,求 1~N 的和
public static int sum(int num){
System.out.println("sum " + num + " 执行开始");
int result;
System.out.println("num: " + num);
if (num == 1){
System.out.println("sum " + num + " 执行结束");
return 1;
}
result = sum(num - 1);
System.out.println("result: " + result);
result += num;
System.out.println("result += num: " + result);
System.out.println("sum " + num + " 执行结束");
return result;
}
}
结果:
sum 4 执行开始
num: 4
sum 3 执行开始
num: 3
sum 2 执行开始
num: 2
sum 1 执行开始
num: 1
sum 1 执行结束
result: 1
result += num: 3
sum 2 执行结束
result: 3
result += num: 6
sum 3 执行结束
result: 6
result += num: 10
sum 4 执行结束
------------
sum: 10
Java方法
合集总目录:学习笔记--Java合集
学习笔记--Java中方法递归调用的更多相关文章
- JAVA中方法的调用主要有以下几种
JAVA中方法的调用主要有以下几种: 1.非静态方法 非静态方法就是没有 static 修饰的方法,对于非静态方法的调用,是通过对 象来调用的,表现形式如下. 对象名.方法() eg: public ...
- Java中的递归调用
Java中不合理的使用递归调用,可能会导致栈内存溢出,这点是需要注意的. java将为每个线程维护一个栈,栈里将为每个方法保存一个栈帧,栈帧代表了一个方法的运行状态. 也就是我们常说的方法栈.最后一个 ...
- 2.1多线程(java学习笔记) java中多线程的实现(附静态代理模式)
一.多线程 首先我们要清楚程序.进程.线程的关系. 首先进程从属于程序,线程从属于进程. 程序指计算机执行操作或任务的指令集合,是一个静态的概念. 但我们实际运行程序时,并发程序因为相互制约,具有“执 ...
- Java面向对象---方法递归调用
递归调用是一种特殊的调用形式,即方法自己调用自己 public int method(int num){ if(num==1){ return 1; } else { return num+metho ...
- Android学习笔记----Java中的字符串比较
用习惯了C#.C++,在做字符串比较时想当然地使用如下语句: string str1 = "abcd", str2 = "abcd"; if(str1==str ...
- 学习笔记--Java中的变量
Java中的变量 /** * 关于 Java 语言当中的变量: * * 1. 什么是变量? * - 变量的本质上来说是内存空间,这块空间有(数据类型.名字.字面值) * - 变量包括三部分:数据类型. ...
- 设计模式学习笔记——java中常用的设计模式
单例设计模式(Singleton Pattern) 观察者模式(Observer Pattern) 工厂模式(Factory Pattern) 策略模式(Strategy Pattern) 适配器模式 ...
- Java学习笔记-Java中的常用类
Java中有很多类是很常用的,此处列举System,Runtime,Date,Calendar,Math System System:类中的方法和属性都是静态的 字段摘要 static PrintSt ...
- java学习笔记--java中的基本数组[5]
java基础很重要, 今天呆家看java视频,顺便总结前几周看的java书籍,做一下简单的总结:1:数组的声明,2:数组的赋值: 3:数组的方法: 声明一个数组主要有两种方式: //类型 []数组名字 ...
- Java中通过递归调用删除文件夹下所有文件
摘自 : http://blog.sina.com.cn/s/blog_79333b2c0100xiu4.html import java.io.File; public class FileTest ...
随机推荐
- 慢查询SQL优化
记一次慢查询的SQL优化 测试表结构 MariaDB [shoppings]> desc login_userinfo; +------------+-------------+------+- ...
- 牛逼!50.3K Star!一个自动将屏幕截图转换为代码的开源工具
1.背景 在当今快节奏的软件开发环境中,设计师与开发者之间的协同工作显得尤为重要.然而,理解并准确实现设计稿的意图常常需要耗费大量的时间和沟通成本.为此,开源社区中出现了一个引人注目的项目--scre ...
- kubernetes pod升级与回滚扩容与缩容
运行一个容器: apiVersion: apps/v1 kind: Deployment metadata: annotations: deployment.kubernetes.io/revisio ...
- H5图片预览
官方链接下载示例项目需要注册账号,似乎有点不友好,不想注册账号的可以去gitee上下载示例项目 如果你上来就是把previewImg.js 放在head中可能会出现意想不到的错误,比如下面这样子,遇到 ...
- SHA256/SHA512码计算方式
(1)Windows系统计算SHA256/SHA512码的方式: certutil -hashfile yourfilename SHA256/SHA512 以计算readme.txt文档进行说明: ...
- nginx resolver 指定多个DNS (2个DNS)
nginx resolver 指定多个DNS (2个DNS) 直接在 resolver 后边填2个DNS,中间用空格 location / { resolver 223.5.5.5 114.114.1 ...
- redis 远程连接
redis-cli -h host -p port -a password -h 服务器地址 -p 端口号 -a 密码
- spring mvc统一处理接口返回值,aop切面实现,将请求的入参和出参存储在数据库中,切面内重新抛出异常
spring mvc统一处理接口返回值,aop切面实现,将请求的入参和出参存储在数据库中 aop类实现Aspect的多个方法注解中,只有Around注解的方法是有返回值的,可以对方法的入参和返回值均进 ...
- Rust性能分析之测试及火焰图,附(lru,lfu,arc)测试
性能测试,在编写代码后,单元测试及性能测试是重要的验收点,好的性能测试可以让我们提前发现程序中存在的问题. 测试用例 在Rust中,测试通常有两部分,一部分是文档测试,一部分是模块测试. 通常我们在函 ...
- 牛客小白月赛96(待F)
比赛链接:牛客小白月赛96 赛时感受 赛时在前面卡的时间有点长,C题没开longlong wa了n发,D题没考虑负数又wa了n发,然后来写E的时候时间就不长了,匆忙写一次交一发. A 思路 当其中一个 ...