关于java的递归

关于java的递归

本篇文章来了解以下java方法的最后一个基础知识,递归,递归是一个非常简便的东西,也是一个非常危险的东西🤣下面向大家仔细说明以下什么是递归,以及递归的注意事项,实现逻辑等。

递归

  • 我们见到过A方法调用B方法,main()方法就是最好的例子。
public class Demo
{public static void main(String[] args){test();//main方法调用我们定义的方法,A调用B}//随便定义一个方法public static void test(){System.out.println("Hello");}
}
  • 递归就是,A调用A,自己调用自己!
  • 但是递归不是一个好的用法,我们下面举例说明一下。
public class Demo
{public static void main(String[] args){Demo demo =new Demo();demo.test();}//自己调用了自己public void test(){test();}
}

我们上述的代码中,test方法自己调用了自己,然后再用main方法去调用一次,我们执行一下代码,就会发现如下报错

Exception in thread "main" java.lang.StackOverflowError//栈溢出异常at method.Demo.test(Demo.java:12)at method.Demo.test(Demo.java:12)at method.Demo.test(Demo.java:12)at method.Demo.test(Demo.java:12)
.......

我们会发现,报错栈溢出了,这是因为,反复调用自己,没有终止标记,陷入了一个死循环中,导致栈溢出,什么是栈我们在下文中说明一下,所以,递归需要注意递归结构

  • 利用递归可以用简单的程序来解决一些复杂的问题。它通常把一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解,递归策略只需少量的程序就可描述出解题过程所需要的多次重复计算,大大地减少了程序的代码量。
  • 递归的能力在于用有限的语句来定义对象的无限集合。

递归的结构

  • 递归头:什么时候不调用自己,如果没有头,就会死循环,也就是结束终止标记。
  • 递归体:什么时候要调用自己。

下面用实现阶乘的方法来介绍一下递归的头和体。

public class Demo
{public static void main(String[] args){System.out.println(sum(5));}//阶乘//1! 1//2! 2*1//5! 5*4*3*2*1public static int sum(int n){if(n==1){return 1;}else{return n*sum(n-1);//调用自己,每次减少1}}
}

我们执行一下代码,发现结果是

120进程结束.....

我们实现出来,但是可能不太好理解,我们将它分解一下。

假如我们输入的数字是2,实参是2,传到方法中的时候先进行判断,然后进入else,执行2*sum(1),sum(1)的返回结果是1。

我们输入的数字是5

第一步,判断,不满足,返回 5 * sum(4)

到这就可以理解为我们输入了4

第二步,判断,不满足,返回 4 * sum(3)

到这就可以理解为我们输入了3

第三步,判断,不满足,返回 3 * sum(2)

到这就可以理解为我们输入了2

第四步,判断,不满足,返回 2 * sum(1)

到这就可以理解为我们输入了2

第五步,判断,满足,返回1

所以,最终的输出结果,5 * 4 * 3 * 2 * 1,结果为120😀

  • 因为1的阶乘是1本身,所以到1的时候,就结束自身调用了,这个就叫递归头,专业名称叫边界条件
  • 下面的自身调用,就是递归体,叫返回阶段

  • 递归虽然有的时候,可以实现一些复杂运算的代码,但是不建议使用!
  • java中有栈机制的说法,就好比一个容器,main方法调用一次递归方法,就会堆积一层,直到程序执行完,全部释放。
  • 所以,过度使用递归,会导致程序深度过大,内存占用过高,系统崩溃。
  • 我们就刚刚的阶乘来举例说明一下。
public class Demo
{public static void main(String[] args){System.out.println(sum(100000));//这里输入10万}//阶乘//1! 1//2! 2*1//5! 5*4*3*2*1public static int sum(int n){if(n==1){return 1;}else{return n*sum(n-1);//调用自己,每次减少1}}
}

我们在传参的时候,传一个10万,让它去进行阶乘计算,这样的话就太过于堆积,不断的累加,会让内存无法释放,直到卡死🥲

所以我们说,递归适合用于一些情况下,就相当于循环方法,要有度,尽量不要使用在关键的代码中,向这种十万的阶乘,我们可以考虑用别的算法去实现😀。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/594141.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

mapboxgl 中给地图添加遮罩蒙版,并不遮罩其中一块区域

文章目录 概要效果预览技术思路技术细节小结 概要 本篇文章主要是给一整块地图添加遮罩层蒙版,但是不遮罩其中一个区域,以反向高亮地区内容。 效果预览 技术思路 这里要实现某个区域反显高亮,需要这个区域的边界json文件,与ech…

java 类和对象的概念

类和对象的概念 面向对象当中最主要“一词”是:对象。 什么是类? 类实际上在现实世界当中是不存在的,是一个抽象的概念,是一个模板,是我们人类大脑进行思考、总结、抽象的一个结果。 (主要是因为人类的大脑…

每天五分钟计算机视觉:为什么要去GitHub寻找开源代码实现方案?

计算机视觉技术是当前人工智能领域的热门方向之一,其在许多领域都有着广泛的应用,如自动驾驶、智能安防、医疗诊断等。由于计算机视觉技术涉及到的算法和数据处理较为复杂,因此对于初学者来说,从零开始编写代码实现相关算法可能会…

69. X的平方根

给你一个非负整数 x ,计算并返回 x 的 算术平方根 。 由于返回类型是整数,结果只保留 整数部分 ,小数部分将被 舍去 。 注意:不允许使用任何内置指数函数和算符,例如 pow(x, 0.5) 或者 x ** 0.5 。 示例 1&#xff1…

案例088:基于微信小程序的校车购票平台设计与实现

文末获取源码 开发语言:Java 框架:SSM JDK版本:JDK1.8 数据库:mysql 5.7 开发软件:eclipse/myeclipse/idea Maven包:Maven3.5.4 小程序框架:uniapp 小程序开发软件:HBuilder X 小程序…

ASP.NET Core AOT

Native AOT 最初在 .NET 7 中引入,在即将发布的 .NET 8 版本中可以与 ASP.NET Core 一起使用。在这篇文章中,我们从总体角度审视其优点和缺点,并进行测量以量化不同平台上的改进。 源代码:https://download.csdn.net/download/he…

ebay产品名称规则是什么?eBay产品主图规则是什么?-站斧浏览器

ebay产品名称规则是什么? 1、简洁明了:在eBay上,产品命名应该简洁明了,避免使用过长或复杂的词汇。买家通常会使用关键词搜索商品,因此使用简洁的命名可以提高产品在搜索结果中的排名。 2、准确描述:产品…

《使用ThinkPHP6开发项目》 - ThinkPHP6创建菜单模块

#CSDN 年度征文|回顾 2023,赢专属铭牌等定制奖品# 一、创建菜单模块 1、创建系统菜单表 CREATE TABLE menu (id int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT 菜单ID,menu_name varchar(32) NOT NULL DEFAULT COMMENT 菜单名称,path varchar(2…

KBDPL.DLL文件丢失,软件游戏无法启动,修复方法

不少小伙伴,求助说遇到Windows弹窗提示“KBDPL.DLL文件丢失,应用无法启动的问题”,不知道应该怎么修复? 首先,先来了解“KBDPL.DLL文件”是什么? kbdpl.dll是Windows操作系统的一部分,是一个动…

三菱plc的点动控制循环(小灯闪烁,单控气缸循环)

以为前一段时间小编做了一个气缸定时循环的程序,根据程序有不足之处,所以小编写下这篇文章,将网络上的plc小灯控制进行总结!如果对你有帮助,不要忘了点赞收藏!如果有更加好的梯形图,欢迎评论&am…

八怪:再谈 MySQL 8 这两个精准的时间戳

MySQL 8.0 的 binlog 中多了 immediate_commit_timestamp 和 original_commit_timestamp 的信息,网上也有很多文章进行解释,最近也刚好遇到相关问题,刚好稍微学习一下。 作者:高鹏(八怪),《MySQ…

教育机构培训系统小程序功能清单

制作一款适合自己的教育机构培训系统小程序,可以为学员提供更便捷的学习体验,同时提高机构的教学效率。今天将详细介绍如何使用乔拓云平台制作教育机构培训系统小程序。 在浏览器搜索乔拓云,登录到后台,选择教育系统并点击进入。在…

基于SSM(非maven)的教室预约管理系统——有报告(Javaweb)

项目简介 本项目为基于SSM(非maven)的教室预约管理系统,本项目主要分为二种角色:用户,管理员 管理员拥有功能:教室信息管理、预约审核管理、预约记录查询、用户注册管理、修改个人信息、退出登录等 用户…

2024年阿里云优惠券领取及使用教程

阿里云作为国内领先的云计算服务提供商,一直致力于为客户提供优质、高效的服务。为了更好地回馈客户,阿里云经常会推出各种优惠活动,其中就包括阿里云优惠券。本文将详细介绍如何领取及使用阿里云优惠券。 一、阿里云优惠券介绍 阿里云优惠券…

SpringBoot的基础配置

问题导入 入门案例中没有引入spring-webmvc等依赖包,没有配置Tomcat服务器,为什么能正常启动?我们没有配置端口号,为什么端口是8080? 起步依赖 starter SpringBoot中常见项目名称,定义了当前项目使用的所…

CEC2017(Python):五种算法(DBO、HHO、RFO、SSA、PSO)求解CEC2017

一、5种算法简介 1、蜣螂优化算法DBO 2、哈里斯鹰优化算法HHO 3、红狐优化算法RFO 4、麻雀搜索算法SSA 5、粒子群优化算法PSO 二、CEC2017简介 参考文献: [1]Awad, N. H., Ali, M. Z., Liang, J. J., Qu, B. Y., & Suganthan, P. N. (2016). “Problem d…

阿里云系统盘测评ESSD、SSD和高效云盘IOPS、吞吐量性能参数表

阿里云服务器系统盘或数据盘支持多种云盘类型,如高效云盘、ESSD Entry云盘、SSD云盘、ESSD云盘、ESSD PL-X云盘及ESSD AutoPL云盘等,阿里云百科aliyunbaike.com详细介绍不同云盘说明及单盘容量、最大/最小IOPS、最大/最小吞吐量、单路随机写平均时延等性…

炫云常见咨询问题TOP榜(云渲染软件专题)

在上一期,小编带大家盘点了年度炫云云渲染使用相关常见咨询问题TOP20。这份榜单不仅是对过去一年用户关注焦点的回顾,更是一个汇总了各类问题解答的宝典。无论您是初次使用还是老用户,都能帮助您更快速地解决疑问,提升使用炫云各类…

Harmony 开始支持 Flutter ,聊聊 Harmony 和 Flutter 之间的因果

原创作者:恋猫de小郭 相信大家都已经听说过,明年的 Harmony Next 版本将正式剥离 AOSP 支持 ,基于这个话题我已经做过一期问题汇总 ,当时在 现有 App 如何兼容 Harmony Next 问题上提到过: 华为内部也主导适配目前的主…

构建 PHP 开发环境:使用 Docker 和阿里云镜像加速器

2. ji引言 docker Docker 是一个开源的容器化平台,它允许开发者打包应用及其依赖项到一个轻量级、可移植的容器中,然后可以在任何支持 Docker 的机器上运行这些容器。Docker 容器非常适合持续开发、测试和部署的工作流程。 主要特点: 轻量…