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 停止工作

方法递归的使用

  1. 什么是递归?

    方法自身调用自身

     a(){
    a();
    }
  2. 递归是很耗费栈内存的,递归算法能不用就尽量不用

  3. 递归必须有结束条件,不然必定会发生栈内存溢出错误

  4. 递归即使有结束条件,但也可能发生栈内存溢出错误,因为递归的太深了

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中方法递归调用的更多相关文章

  1. JAVA中方法的调用主要有以下几种

    JAVA中方法的调用主要有以下几种: 1.非静态方法 非静态方法就是没有 static 修饰的方法,对于非静态方法的调用,是通过对 象来调用的,表现形式如下. 对象名.方法() eg: public ...

  2. Java中的递归调用

    Java中不合理的使用递归调用,可能会导致栈内存溢出,这点是需要注意的. java将为每个线程维护一个栈,栈里将为每个方法保存一个栈帧,栈帧代表了一个方法的运行状态. 也就是我们常说的方法栈.最后一个 ...

  3. 2.1多线程(java学习笔记) java中多线程的实现(附静态代理模式)

    一.多线程 首先我们要清楚程序.进程.线程的关系. 首先进程从属于程序,线程从属于进程. 程序指计算机执行操作或任务的指令集合,是一个静态的概念. 但我们实际运行程序时,并发程序因为相互制约,具有“执 ...

  4. Java面向对象---方法递归调用

    递归调用是一种特殊的调用形式,即方法自己调用自己 public int method(int num){ if(num==1){ return 1; } else { return num+metho ...

  5. Android学习笔记----Java中的字符串比较

    用习惯了C#.C++,在做字符串比较时想当然地使用如下语句: string str1 = "abcd", str2 = "abcd"; if(str1==str ...

  6. 学习笔记--Java中的变量

    Java中的变量 /** * 关于 Java 语言当中的变量: * * 1. 什么是变量? * - 变量的本质上来说是内存空间,这块空间有(数据类型.名字.字面值) * - 变量包括三部分:数据类型. ...

  7. 设计模式学习笔记——java中常用的设计模式

    单例设计模式(Singleton Pattern) 观察者模式(Observer Pattern) 工厂模式(Factory Pattern) 策略模式(Strategy Pattern) 适配器模式 ...

  8. Java学习笔记-Java中的常用类

    Java中有很多类是很常用的,此处列举System,Runtime,Date,Calendar,Math System System:类中的方法和属性都是静态的 字段摘要 static PrintSt ...

  9. java学习笔记--java中的基本数组[5]

    java基础很重要, 今天呆家看java视频,顺便总结前几周看的java书籍,做一下简单的总结:1:数组的声明,2:数组的赋值: 3:数组的方法: 声明一个数组主要有两种方式: //类型 []数组名字 ...

  10. Java中通过递归调用删除文件夹下所有文件

    摘自 : http://blog.sina.com.cn/s/blog_79333b2c0100xiu4.html import java.io.File; public class FileTest ...

随机推荐

  1. .net Mvc5Webapi接口接收参数为null的一种情况分享

    同样的前后端项目,其他接口用post接收自定义对象形式的参数,是能成功接收的.在这个前提下,出现某个接口接收的参数为null或值全是默认值,可能的原因是这样: 前端定义的参数的字段比后台定义的dto对 ...

  2. IceRPC之多路复用传输>快乐的RPC

    作者引言 很高兴啊,我们来到了IceRPC之多路复用传输>快乐的RPC,基础引导,打好基础,才能让自已不在迷茫,快乐的畅游世界. icerpc 和多路复用传输 了解 icerpc 协议和多路复用 ...

  3. RocketMQ主从同步原理

    一. 主从同步概述 主从同步这个概念相信大家在平时的工作中,多少都会听到.其目的主要是用于做一备份类操作,以及一些读写分离场景.比如我们常用的关系型数据库mysql,就有主从同步功能在. 主从同步,就 ...

  4. Django----模型----数据库的基本操作

    1.添加记录 方式一:save() 方式二(推荐):create() 2.查询记录 (1)all() 查询所有记录,返回queryset对象. stu_list = Student.objects.a ...

  5. .NET6之MiniAPI(九):基于角色的身份验证和授权

    身份验证是这样一个过程:由用户提供凭据,然后将其与存储在操作系统.数据库.应用或资源中的凭据进行比较. 在授权过程中,如果凭据匹配,则用户身份验证成功,可执行已向其授权的操作. 授权指判断允许用户执行 ...

  6. golang import 导入的四种方式

    1 标准导入: import "package_name" 2 导入别名: import ( alias "package_name" ) 3 匿名导入: _ ...

  7. 如果设备不支持vulkan,就用swiftshader,否则就加载系统的vulkan的正确姿势(让程序能够智能的在vulkan-1.dll和libvk_swiftshader.dll之间切换)

    一些老的显卡设备没有更新驱动,甚至根本就不支持Vulkan的显卡,遇到静态链接的vulkan-1.lib文件,启动exe就会崩溃. 你以为从别的机器拷贝这个vulkan-1.dll就可以了吗? 太傻太 ...

  8. Steam Epic 启动程序默认地址

    Steam Epic 启动程(启动器)序默认地址 "D:\Games\EpicAPP\Epic Games\Launcher\Portal\Binaries\Win32\EpicGamesL ...

  9. ClickHouse + ClickVisual 构建日志平台

    越来越多的互联网公司开始尝试 ClickHouse 存储日志,比如映客.快手.携程.唯品会.石墨文档,但是 ClickHouse 存储日志缺少对应的可视化方案,石墨文档开源了 ClickVisual ...

  10. PIC18 bootloader之RS485 bootloader

                                  了解更多关于bootloader 的C语言实现,请加我Q扣: 1273623966 (验证信息请填 bootloader),欢迎咨询或定制b ...