Java零基础入门-递归

一、概述

        上一期,我们是具体学习了File类的一些概念基础知识点,以及对于该类的常用方法进行了一个全量举例演示,这也是考虑到有的小伙伴在阅读的同时,没有时间去实际测试,所以我也就顺带的给大家去做了实例演示,一来给需要的小伙伴能有个标准答案可观摩,二来就是为了方便有些读者没有实操场地从而可以看我的列举并对于每一个实例都有一个对应的截图,这就很为读者们参考了。而这一期,我要给你们聊点什么呢?这是个问题,刚下班到家,头有点迷糊,但是今天的文章还没更新, 所以需要给你们一个交代不是。

        所以这一期,我跟大家聊聊递归吧!以前在刷题的时候经常有用到递归思路,所以对于大家而言,递归思想也是需要掌握的。

        废话不多说,咱这就开始干正事!

二、本期教学目标

  • 掌握何为递归
  • 能够使用递归的方式计算一些阶乘
  • 能够简单谈谈递归的优劣
  • 能够谈谈递归会导致内存溢出隐患的问题
  • ...

三、正文

1、概念

        一开始听到这么个词,肯定不是很理解,那你们字面理解递归二字应该是啥意思呢?其实呢,也很好理解,递归就是指在当前方法内自己调用自己这么种现象,就被称为递归。

2、递归分类

        递归也分类,一般递归分为直接递归和间接递归。

  • 直接递归:指方法自身调用自身。
  • 间接递归:值相互之间调用,比如a方法调用b方法,b方法调用c方法,c方法调用a方法。

3、递归优劣比较

        需要注意的是,递归容易造成死循环,也就是我提到的内存溢出问题,所以对于递归要有条件限定,保证递归能够正常结束,而不是一直死循环自我调用跳不出来。

        其次就是递归需要限定条件,但是递归次数不能太多,否则也很有可能发生栈内存溢出。

        最后就是,对于构造方法,是不允许递归的。

4、解释内存溢出隐患问题

        这问题也就是我上述提到的“死循环”,既然要用递归,那一定要限定条件及终结递归的条件,保证递归能跳出,否则一直递归下去,肯定得把内存占满,导致内存溢出。

四、实例演示

        接下来,就是实战环节了,我先问大家个问题?累加如何实现?遍历嘛?按次数遍历,这是最普通的做法?那我要是说到递归呢?我说就可以用递归来解决。

        说到累加,累乘,这类题若不要求时间复杂度,那最简便快捷的方式就是采用递归的实现方式,所以接下来,我给大家诺列几道递归题,结合实际场景来运用递归思想,帮助大家能快速吸收掌握。

1、实例题1

请计算1-10之间的累加和。要求用递归思想实现。

分析:何为累加,就是前两数之和与后一个相加,然后之和接着与后一个数进行累加,就比如num(n) = num(n-2)+num(n-1),所以你看啊,这里就其实满足递归的创建了,累加的操作就可以定义成一个方法,然后递归调用。这样说你们能理解么?不理解也没事,我接下来带着大家去实现一遍这道题吧。

代码如下:

第一步,我们先来找找规律,从规律中找到方法如何定义,具体如下:

sum(1) = num1

sum(2) = sum(1) + num[2]

sum(3) = sum(2) +num[3]

sum(4) = sum(3) +num[4]

sum(5) = sum(4) +num[5]

...

sum(n) = sum(n-1) +num[n]

        所以,这规律完全具备递归条件,接下来,你们知道递归函数怎么写了吗?

代码如下: 

//递归求和public int getSum(int num) {/*** 方法的出口,num总有为1的时候。*/if (num == 1) {return 1;}//num不为1时,方法返回 num +(num‐1)的累和//递归自我调用getSum()return num + getSum(num - 1);}

然后我们再来写个测试类,调用该getSum()函数,然后入参我们传10。

    @Testpublic void test() {//求1-10累加和System.out.println("1-10累加和为:" + this.getSum(10));}

具体运行控制台打印:

打印结果是不是对的啊。若你不是很清楚它具体的执行的方式,我还可以给你打印一下执行过程。

         我是直接将num给打印了,你们看,其实递归是执行了10次,这样你们总能理解了吧。

2、实例题2

请计算10的阶乘。要求用递归思想实现。

分析:可以先找找规律,也是有帮你如何实现累乘方法。

sum(1) = num1

sum(2) = sum(1) * num[2]

sum(3) = sum(2) * num[3]

sum(4) = sum(3) * num[4]

sum(5) = sum(4) * num[5]

...

sum(n) = sum(n-1) +num[n]

那么n的阶乘拆开应该为:n! = n * (n‐1) *...* 3 * 2 * 1

所以代码实现也很简单。

    @Testpublic void test() {//求10!System.out.println("10!结果为:" + this.getSum(10));}//递归求阶乘public int getSum(int num) {/*** 方法的出口,num总有为1的时候。*/if (num == 1) {return 1;}//递归自我调用getSum()return num * getSum(num - 1);}

具体运行控制台打印:

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

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

相关文章

数据生成 | Matlab实现基于K-means和SVM的GMM高斯混合分布的数据生成

数据生成 | Matlab实现基于K-means和SVM的GMM高斯混合分布的数据生成 目录 数据生成 | Matlab实现基于K-means和SVM的GMM高斯混合分布的数据生成生成效果基本描述模型描述程序设计参考资料 生成效果 基本描述 1.Matlab实现基于K-means和SVM的GMM高斯混合分布的数据生成&#xf…

【实现100个unity特效之7】unity 3d实现各种粒子效果

文章目录 先看最终效果下雨效果萤火虫和火花四溅的效果 3d下雨粒子效果涟漪效果雨滴和涟漪效果结合水花效果雨滴涟漪水花结合问题雾气效果萤火虫火花效果萤火虫和火花效果结合其他特效爆炸、闪电、火焰、雷雨特效(2023/7/5更新)源码完结 先看最终效果 下…

爬虫 新闻网站 并存储到CSV文件 以红网为例 V2.0 (控制台版)升级自定义查询关键词、时间段,详细注释

爬虫:红网网站, 获取指定关键词与指定时间范围内的新闻,并存储到CSV文件 V2.0(控制台版) 爬取目的:为了获取某一地区更全面的在红网已发布的宣传新闻稿,同时也让自己的工作更便捷 对比V1.0升级的…

达梦体系结构:进程架构

达梦体系结构:进程架构 进程结构监听线程会话线程工作线程IO线程日志刷盘线程日志归档线程日志重做线程调度线程检查点线程 达梦数据库由数据库和实例构成: 数据库是指磁盘上存放的数据库文件的集合,包括参数文件、控制文件、数据文件、日志…

ObjectiveC-10-OOP面向对象程序设计-分类/类别

类别(Category)是OjectiveC的一个特性,主要目的是让开发者可以以模块的形式向类添加方法(扩展),创建标准化的方法列表供给其他人实现。 有些文档也会翻译成类别,其实是一个意思。 概述 语法说明 类别提供了一个简单的…

Codeforces Round 933 (Div. 3)G. Rudolf and Subway 虚点辅佐的dijkstra,用的链式前向星

Problem - G - Codeforces 推荐视频题解:G_哔哩哔哩_bilibili 思路: 先不管同一个线路上的,就正常建边,这样点距都是1. 然后虚点就是该线路的每个点都连的点。 到虚点的边权是1,表示我们坐这趟线路。 然后这个虚点…

C语言中strlen函数的实现

C语言中strlen函数的实现 为了便于和strlen函数区别,以下命令为_strlen。 描述:实现strlen,获取字符串的长度,函数原型如下: size_t strlen(const char *str);_strlen实现: size_t _strlen(const char*…

在flutter中添加video_player【视频播放插件】

添加插件依赖 dependencies:video_player: ^2.8.3插件的用途 在Flutter框架中,video_player 插件是一个专门用于播放视频的插件。它允许开发者在Flutter应用中嵌入视频播放器,并提供了一系列功能来控制和定制视频播放体验。这个插件对于需要在应用中展…

Django - 视图和模板

视图 视图 - 是具体的业务代码 在 app 下的 views.py 文件中编写代码 from django.http import HttpResponsedef index(request):return HttpResponse("这里是我的站点")为了调用该视图,我们还需要编写urlconf,也就是路由配置。在polls目录中…

Vite 项目中环境变量的配置和使用

Vite 项目中环境变量的声明 我们要在 Vite 项目中进行环境变量的声明,那么需要在项目的根目录下,新建 .env.[mode] 文件用于声明环境变量,如: .env.test 文件用于测试环境下项目全局变量的声明.env.dev 文件用于开发环境下项目全…

Scikit-Learn K均值聚类

Scikit-Learn K均值聚类 1、K均值聚类1.1、K均值聚类及原理1.2、K均值聚类的优缺点1.3、聚类与分类的区别2、Scikit-Learn K均值聚类2.1、Scikit-Learn K均值聚类API2.2、K均值聚类初体验2.3、K均值聚类案例1、K均值聚类 K-均值(K-Means)是一种聚类算法,属于无监督学习。K-M…

OpenFOAM学习笔记

OpenFOAM 计算流体力学:用计算机求解流体控制方程,来模拟真实情况下,流体的流动状态OpenFOAM的离散方法:有限体积法,将整个空间划分成若干个控制体OpenFOAM使用的网格系统:同位网格(Collocated…

nvm保姆级安装使用教程

✅作者简介:大家好,我是Leo,热爱Java后端开发者,一个想要与大家共同进步的男人😉😉 🍎个人主页:Leo的博客 💞当前专栏: 开发环境篇 ✨特色专栏: M…

python相机校准

文章目录 张正友标定法角点检测标定去畸变 张正友标定法 相片是三维世界在二维平面上的投射,故而其深度信息是损失掉了的。但是,如果把拍照看作理想的小孔成像过程,那么相片中的每个像素,都将通过一个锥体与世界中真实的点一一对…

MongoDB聚合运算符:$median

文章目录 语法参数字段使用类型操作计算注意事项数组处理窗口函数 举例$median作为累加器在 p r o j e c t 阶段使用 project阶段使用 project阶段使用median在$setWindowField阶段使用$median $median聚合运算符以标量值返回中位数的近似值,即第50百分位数。$media…

常见的常见免费开源绘图工具对比 draw.io/Excalidraw/Lucidchart/yEd Graph Editor/Dia/

拓展阅读 常见免费开源绘图工具 OmniGraffle 创建精确、美观图形的工具 UML-架构图入门介绍 starUML UML 绘制工具 starUML 入门介绍 PlantUML 是绘制 uml 的一个开源项目 UML 等常见图绘制工具 绘图工具 draw.io / diagrams.net 免费在线图表编辑器 绘图工具 excalidr…

spa、vue、elementUi

spa (single page application). 动态重写当前页面而非从服务器重新加载整个新页面。使应用程序更像一个桌面应用程序。所有的html、javascript、css通过单个页面检索加载资源。前端页面使用ajax与后端通信。一个项目只有一个html页面。所有的页面跳转都通过路由导航。 vue可用…

【OpenCV进阶】图像中添加中文字幕

OpenCV中的putText函数可以在图像上添加一些你想要的信息,但是该函数只能添加英文字母或数字,无法添加中文字幕。函数原型如下: CV_EXPORTS_W void putText( InputOutputArray img, const String& text, Point org,int fontFace, double…

XSS分类

简介 XSS全称为Cross Site Scripting,为了和CSS分开简写为XSS,中文名为跨站脚本。该漏洞发生在用户端,是指在渲染过程中发生了不在预期过程中的JavaScript代码执行。XSS通常被用于获取Cookie、以受攻击者的身份进行操作等行为。 反射型XSS …

云数据库AWS Aurora(一)

背景 Amazon Aurora 是Amazon Web Services (AWS) 提供的一种关系数据库服务,它兼容并提供与MySQL和PostgreSQL相同的API。Aurora设计为云环境中的商业数据库,具备高性能、高可用性、低成本等特性。 AWS一些组件定义 首先介绍下AWS一些组件。 EC2&am…