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升级的…

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

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

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应用中嵌入视频播放器,并提供了一系列功能来控制和定制视频播放体验。这个插件对于需要在应用中展…

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相机校准

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

C++之双向链表与哈希链表用法区别实例(二百六十八)

简介: CSDN博客专家,专注Android/Linux系统,分享多mic语音方案、音视频、编解码等技术,与大家一起成长! 优质专栏:Audio工程师进阶系列【原创干货持续更新中……】🚀 优质专栏:多媒…

Cisco Unified Communications Manager (CallManager) 15.0 SU1 - 统一通信与协作

Cisco Unified Communications Manager (CallManager) 15.0 SU1 - 统一通信与协作 思科统一通信管理器 (CallManager) 请访问原文链接:https://sysin.org/blog/cisco-ucm-15/,查看最新版。原创作品,转载请保留出处。 作者主页:…

需求分析及设计定义

背景 经过不断的折腾,一切过程都是为了呈现输出,这个阶段就是要交付需求和方案的环节了,很多失败的项目就是上来就到这个环节,倒着捣鼓,先写个文档,做个原型,甚至提出方案,然后再和…

Redis 未授权访问漏洞

出现以下函数 eval函数:因为脚本内容必须通过eval来执行 2.luaopen_io函数:因为此攻击必须通过执行luaopen_io函数来获取 io库 3、.popen函数:恶意命令必须通过io库中的popen函数来执行,为什么拦截规则不是io.popen&#xff0…

状态优先级

文章目录 状态优先级1. 进程状态1.1 进程状态查看1.2 僵尸进程1.3 孤儿进程 2.进程优先级2.1 基本概念2.2 查看系统进程2.3 PRI and NI2.4 PRI vs NI 3. 查看进程优先级的命令3.1 top命令更改nice3.2 其他概念 状态优先级 1. 进程状态 看看Linux内核源代码怎么说 为了弄明白…

深入浅出 -- 系统架构之分布式系统底层的一致性

在分布式领域里,一致性成为了炙手可热的名词,缓存、数据库、消息中间件、文件系统、业务系统……,各类分布式场景中都有它的身影,因此,想要更好的理解分布式系统,必须要理解“一致性”这个概念。 其实关于…

云原生架构(微服务、容器云、DevOps、不可变基础设施、声明式API、Serverless、Service Mesh)

前言 读完本文,你将对云原生下的核心概念微服务、容器云、DevOps、Immutable Infrastructure、Declarative-API、Serverless、Service Mesh 等有一个相对详细的了解,帮助你快速掌握云原生的核心和要点。 因题主资源有限, 这里会选用部分云服务商的组件进…

LeetCode:1026. 节点与其祖先之间的最大差值(DFS Java)

目录 1026. 节点与其祖先之间的最大差值 题目描述: 实现代码与解析: DFS 原理思路: 1026. 节点与其祖先之间的最大差值 题目描述: 给定二叉树的根节点 root,找出存在于 不同 节点 A 和 B 之间的最大值 V&#xff…

11-1(2)-CSS 背景+CSS 精灵图

个人主页:学习前端的小z 个人专栏:HTML5和CSS3悦读 本专栏旨在分享记录每日学习的前端知识和学习笔记的归纳总结,欢迎大家在评论区交流讨论! 文章目录 一、CSS 背景1 背景颜色2 背景色半透明3 背景图片4 背景平铺5 背景图片位置6 …