Java基础—递归方法

什么是递归

一个方法调用自己的方法,方法的递归调用可以重复执行一段代码,看完下面的例子,相信你对递归会有深入的了解:

package Class.Recursion;

public class Demo_Sum {
        public static void main(String[] args) {
            //求1-3的累加和
            int n = sum_recursion(1,3);
            System.out.println(n);
        }

        //实现数据区间的累加和方法
        public static int sum_recursion(int start,int end){
            //出口条件
            if (start == end) {
                return end;
            }
            //递归调用
            return start + sum_recursion(start+1,end);
        }
}

结果:
在这里插入图片描述
下边研究一下sum_recursion方法的递归执行流程,见下图:
在这里插入图片描述
步骤讲解:
1)main方法调用sum_recursion方法,传入1,3;

2)sum_recursion方法调用sum_recursion方法,传入2,3;

3)sum_recursion方法调用sum_recursion方法,传入3,3;

4)sum_recursion方法判断start等于end,返回3给上个调用者;

5)sum_recursion方法返回2+3给上个调用者;

6)sum_recursion方法返回1+2+3给main方法。

我们发现方法的递归调用和方法之间的调用流程是一样,只不过递归调用是调用自己。

如果sum_recursion方法中没有下边的语句将会有什么结果:在这里插入图片描述
StackOverflowError表示“栈溢出”错误。
为什么递归方法调用会抛出StackOverflowError栈溢出错误呢?下面我们分析这个问题,首先我们来了解一下执行方法的原理:

栈帧

每次执行一个方法会在JVM栈中开辟一块内存,用于存放执行方法所需要的数据,比如方法的局部变量、对象引用等 ,这块内存叫栈帧。JVM栈是JVM运行时内存的一个区域,JVM运行时内存还包括堆、方法区、程序计数器等区域。

:是一种数据结构,具有后进先出的特点,下面引用百度百科的栈的模型图来说明栈的特点:
321
对栈的操作包括入栈(也叫压栈)和出栈(也叫弹栈)两个。

入栈是将数据压到栈顶,如上图,首先将a1压入栈,再将a2压入栈,直到将an压入栈,最上边位置叫栈顶,最下边的是栈底,上图an为栈顶元素,a1为栈底元素。

出栈是将数据从栈中弹出,出栈是要弹出的栈顶的元素。

所以,栈的特点是后进先出,先进后出,如上图,an最后入栈,却最先出栈,a1最先入栈却最后出栈。

理解了栈的特点,我们再结合JVM栈和方法执行过程,对应的栈内存结构的变化过程如下:
在这里插入图片描述

压栈是每执行一次方法会创建一个栈帧,每一次的递归调用都会压栈。当方法执行完执行出栈。上述列子中从执行main方法开始,当start等于end时方法执行return 1,即执行方法的出口,此时出栈,直到执行完成main,main方法出栈,程序运行结束,见下图:
在这里插入图片描述
为什么方法递归调用会抛出StackOverflowError栈溢出错误呢?

当我们把方法的出口代码注释,递归调用将不停的在栈中创建栈帧,整个栈的深度会很大,如果超过了虚拟机要求的深度则报StackOverflowError错误。

所以对递归方法的定义一定要有递归方法的出口

选择使用递归还是循环?

一般情况下使用循环结构可以实现递归所实现的功能,只是有时候用递归写代码更明了,递归和循环结构有优劣分析如下:

递归:

优势:

1、代码结构简洁。

劣势:

1、耗费内存,每次调用需要开辟新的栈空间。

2、递归深度大会导致StackOverflowError。

循环结构:

优势:

1、速度快。

劣势:

1、有些场景单纯用循环结构不适合,比如:遍历磁盘中的所有目录及子目录中的所有文件,因为目录结构的复杂性用循环没有递归去遍历目录及子目录方便。

建议:能用循环解决的问题优先用循环解决,适合递归的场景要用递归解决。

范栖荣
关注 关注
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java 基础篇】Java递归详解
繁依Fanyi的博客
06-25 1万+
本文详细介绍了Java中的递归原理、应用场景和实现方法递归是一种强大的编程技术,能够解决复杂问题,简化代码逻辑,并实现高效的算法。通过定义终止条件和递归调用,我们可以实现递归函数来解决各种问题。需要注意的是,递归的使用需要谨慎,要确保终止条件和递归调用的条件正确,并避免陷入无限循环。希望本文对你理解和应用Java中的递归有所帮助!附:示例代码// 终止条件 if(n == 0) {return 1;} // 递归调用 return n * factorial(n - 1);int n = 5。
java递归return
weixin_43850103的博客
08-26 4388
java递归return介绍代码代码流程 介绍 我相信没人没听过递归吧,今天发现一个很有意思的是 ,关于java递归return 代码 public static int fact(int n){ //输入的数不能为负数 if (n<0){ return 0; } //为0确定值为1 if (n==0){ return 1; //自己调用自身的方
Java实现递归及经典案例(不死神兔三种方式)
最新发布
2301_82241859的博客
04-17 611
Java架构进阶面试及知识点文档笔记这份文档共498页,其中包括Java集合,并发编程,JVM,Dubbo,Redis,Spring全家桶,MySQL,Kafka等面试解析及知识点整理Java分布式高级面试问题解析文档其中都是包括分布式的面试问题解析,内容有分布式消息队列,Redis缓存,分库分表,微服务架构,分布式高可用,读写分离等等!互联网Java程序员面试必备问题解析及文档学习笔记Java架构进阶视频解析合集《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》
Java学习 --- 递归
qq_46093575的博客
08-25 579
递归就是方法自己调用自己,每次调用时传入不同的变量。
面试:Java中finally与return执行顺序
王温暖的博客
12-23 713
总结来说就是:try/catch中的return最后执行,返回的结果也只是try/catch中的return的值。
Java方法——递归
TIANZIMANZI的博客
06-07 109
递归
Java基础方法递归.md
08-09
内容概要: 该文档介绍了Java中零基础方法递归的概念和用法。通过一个示例代码演示了方法递归的定义和调用过程,以及如何使用递归解决问题。文档还包含了详细的源码和输出结果,帮助读者更好地理解方法递归的工作...
JAVA基础方法、重载、内存、递归
09-24
JAVA 基础方法、重载、内存、递归JAVA 基础部分主要涵盖了方法、重载、内存和递归四个方面的知识点...JAVA基础部分涵盖了方法、重载、内存和递归四个方面的知识点,了解这些知识点对于java的学习和应用至关重要。
Java基础编程:利用递归方法求5的阶乘
09-21
Java基础编程:利用递归方法求5的阶乘
Java递归基础递归的宏观语意实例分析
08-19
主要介绍了Java递归基础递归的宏观语意,结合实例形式分析了java递归的相关原理、操作技巧与注意事项,需要的朋友可以参考下
java基础题.doc
11-15
Java基础题 本文档涵盖了Java基础知识点,包括函数的定义和使用、变量的定义和赋值、循环语句的使用、Scanner类的使用等。下面将对每个知识点进行详细的解释。 1. 函数的定义和使用 在Java中,函数可以接受参数和...
java递归函数返回值_java基础5(方法、有无返回值、重载、递归
weixin_42301009的博客
02-17 911
方法:定义:解决事情的办法.具有特定功能的代码块特点:1.方法不调用不执行2.类中方法外,方法不能嵌套有返回值类型的方法定义格式:修饰符 返回值类型 方法名([参数列表]){方法体语句;return 返回值;}①修饰符: 访问权限修饰符 public static②返回值类型:在方法执行完毕后,结果的数据类型基本数据类型|引用数据类型③方法名:标识符符合标识符的命名规则和规范,方法的调用要根据方法...
Java递归算法的理解与Demo(包含return的坑)
CSDN_KONGlX的博客
07-08 619
在平时的工作或者面试中,大家一说到“递归”,我们会想到“自己调自己”,确实,程序调用自身的编程技巧称为递归(recursion)。但是在真正编写递归程序的时候一定要具备三个条件: 1.终结条件(满足边界条件时,停止调用自身) 2.递归条件(满足递归条件时,继续调用自身) 3.基本值(例如:下面de...
JAVA基础方法递归调用
m0_68648030的博客
04-17 5490
1、基本说明 递归调用就是在当前的函数中调用当前的函数并传给相应的参数,这是一个动作,这一动作是层层进行的,直到满足一般情况的的时候,才停止递归调用,开始从最后一个递归调用返回。 简单的说:递归就是方法自己调用自己,每次调用是传入不同的变量,递归有助于编程者解决复杂的问题,同时可以让代码变得整洁。 递归本质:程序调用自身的编程技巧叫做递归。 2、递归需要满足三个条件: 边界条件 递归前进段 递归返回段 当边界条件不满足时,递归前进;当边界条件满足时,递归返回。 3、递归能解决什么问题? 各
Java学习—(5)Java方法递归的使用--不看后悔哦】
DJL_new_life的博客
04-09 822
方法递归 能够独立写出递归代码是需要时间和代码的积累,不是一蹴而就的 特别特别重要,大家认真看 先问大家一个问题,什么是方法递归? 所谓方法递归就是在一个方法执行的内部,自己调用了自己的过程,称为递归递归就分为两个子过程: 递过程:方法不断的调用自身,直到走到函数的终止条件,递过程结束 归过程:方法不断返回的过程称为归过程 那在什么场景下才可以使用方法递归呢? 知道了什么场景可以使用递归,那怎么写出递归代码呢? 在写递归函数时,千万不要纠结这个函数内部到底怎么实现,而要注意这个方法的语义(这个函
java递归
linsirboy的博客
11-06 113
java递归
数据结构--知识点16--搜索算法(二叉树)
ANingL的博客
09-06 2901
文章目录一、树的概念1、特点2、树的术语3、树的种类4、树的存储与表示5、常见的树的应用场景二、二叉树1、概念2、性质 一、树的概念 树是一种抽象数据类型(ADT)或是视作这种抽象数据类型的数据结构 1、特点 每个节点有零个或多个子节点 没有父节点的节点称为根节点 每一个非根节点有且只有一个父节点 除了根节点外,每个子节点可以分为**多个不相交(因为都只有一个父节点)**的子树 2、树的术语 节点的度:一个节点含有的子树的个数称为该节点的度 树的度:一棵树中,最大的节点的度称为树的度 叶节点或终端节点
java递归后面的语句_递归中关于递归语句后面内容的执行
weixin_30062621的博客
02-28 493
递归函数中,位于递归调用语句后的语句的执行顺序和各个被调用函数的顺序相反;下面看一个经典的例子:#includevoid up_and_down(int);int main(void){up_and_down(1);return 0;}void up_and_down(int n){printf("Level %d:n location %p/n",n,&n); /* 1 */if(n&l...
递归过程中语句执行顺序
菜鸡逆袭的博客
08-13 6980
递归的两种模式 模式一 //递归的过程中在&amp;quot;递&amp;quot;的过程中解决问题 function function_name(Max_argument){ if(end_condition){ end; }else{ solve; function_name(Min_argument);//问题规模逐渐减小 } } 注:位于递归函...
Java写个递归方法
04-25
好的,我可以为您提供一个递归方法Java代码示例: ``` public class TreeNode { private int data; private TreeNode left; private TreeNode right; public TreeNode(int data) { this.data = data; } public void insert(int value) { if (value < data) { if (left == null) { left = new TreeNode(value); } else { left.insert(value); } } else { if (right == null) { right = new TreeNode(value); } else { right.insert(value); } } } public void printInOrder() { if (left != null) { left.printInOrder(); } System.out.println(data); if (right != null) { right.printInOrder(); } } } ``` 这是一个基础的二叉树的Java实现,包含了递归插入节点和中序遍历输出节点的方法。您可以根据自己的需求进行修改和扩展。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
写文章

热门文章

  • Java基础 - Java环境及编译运行原理 2185
  • Java基础 - 类与对象 782
  • Java基础—递归方法 654
  • Java基础 - 接口 587
  • Java基础 - 封装 102

最新评论

  • Java基础 - 类与对象

    CSDN-Ada助手: 推荐 Java 技能树:https://edu.csdn.net/skill/java?utm_source=AI_act_java

您愿意向朋友推荐“博客详情页”吗?

  • 强烈不推荐
  • 不推荐
  • 一般般
  • 推荐
  • 强烈推荐
提交

最新文章

  • Java基础 - 多态
  • Java基础 - Java环境及编译运行原理
  • Java基础 - 接口
2023年6篇

目录

目录

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值

聚圣源企业起名打分免费测试储姓鼠男宝宝起名牛年起名宜用字我的狐仙女友第二季猫咪起名公猫全家超市南非大象突然冲向卡车吓懵司机中国vs阿联酋艾草仙姑商店起名大全免费版nba联盟百事通加油站起名大全翁起名大全姓孟的怎么起名洛克人zero3金手指谢氏起名男宝名字免费生辰八字起名查询屈原的简介资料麻辣烫起名大全集宝宝生辰八字起名手机版金融产品网站特色中餐加盟taritari公司免起名姓翁起名字兔字起名起名 男孩论文题目大全科技公司起名的关键字兰州拉面排行榜店起名淀粉肠小王子日销售额涨超10倍罗斯否认插足凯特王妃婚姻让美丽中国“从细节出发”清明节放假3天调休1天男孩疑遭霸凌 家长讨说法被踢出群国产伟哥去年销售近13亿网友建议重庆地铁不准乘客携带菜筐雅江山火三名扑火人员牺牲系谣言代拍被何赛飞拿着魔杖追着打月嫂回应掌掴婴儿是在赶虫子山西高速一大巴发生事故 已致13死高中生被打伤下体休学 邯郸通报李梦为奥运任务婉拒WNBA邀请19岁小伙救下5人后溺亡 多方发声王树国3次鞠躬告别西交大师生单亲妈妈陷入热恋 14岁儿子报警315晚会后胖东来又人满为患了倪萍分享减重40斤方法王楚钦登顶三项第一今日春分两大学生合买彩票中奖一人不认账张家界的山上“长”满了韩国人?周杰伦一审败诉网易房客欠租失踪 房东直发愁男子持台球杆殴打2名女店员被抓男子被猫抓伤后确诊“猫抓病”“重生之我在北大当嫡校长”槽头肉企业被曝光前生意红火男孩8年未见母亲被告知被遗忘恒大被罚41.75亿到底怎么缴网友洛杉矶偶遇贾玲杨倩无缘巴黎奥运张立群任西安交通大学校长黑马情侣提车了西双版纳热带植物园回应蜉蝣大爆发妈妈回应孩子在校撞护栏坠楼考生莫言也上北大硕士复试名单了韩国首次吊销离岗医生执照奥巴马现身唐宁街 黑色着装引猜测沈阳一轿车冲入人行道致3死2伤阿根廷将发行1万与2万面值的纸币外国人感慨凌晨的中国很安全男子被流浪猫绊倒 投喂者赔24万手机成瘾是影响睡眠质量重要因素春分“立蛋”成功率更高?胖东来员工每周单休无小长假“开封王婆”爆火:促成四五十对专家建议不必谈骨泥色变浙江一高校内汽车冲撞行人 多人受伤许家印被限制高消费

聚圣源 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化