Java零基础入门-递归

news2024/7/4 5:33:20

一、概述

        上一期,我们是具体学习了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。

    @Test
    public 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

所以代码实现也很简单。

    @Test
    public 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.coloradmin.cn/o/1571470.html

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

相关文章

自动驾驶涉及相关的技术

当科幻走进现实,当影视照进生活,无数次憧憬的自动驾驶,正在慢慢的梦想成真。小时候天马星空的想象,现在正悄无声息的改变着我们的生活。随着汽车电动化进程的加快,自动驾驶技术映入眼帘,很多人可能感觉遥不…

软考 系统架构设计师系列知识点之数据库基本概念(1)

所属章节: 第6章. 数据库设计基础知识 第1节 数据库基本概念 数据(Data)是描述事务的符号记录,它具有多种表现形式,可以是文字、图形、图像、声音和语言等。信息(Information)是现实世界事物的…

使用SVD将图像压缩四分之一(MATLAB)

SVD压缩前后数据量减少的原因在于,通过奇异值分解(SVD),我们将原始数据(如图像)转换成了一种更加紧凑的表示形式。这种转换依赖于数据内部的结构和相关性,以及数据中信息的不均匀分布。 让我们…

10-用PySpark建立第一个Spark RDD

目录 RDD概念RDD特点建立RDD的方式不同工具建立RDD的方式使用PySpark Shell(交互环境)建立RDD使用VSCode编程建立RDD使用Jupyter Notebook建立RDD 总结 PySpark实战笔记系列第一篇 RDD概念 Apache Spark的核心组件的基础是RDD。所谓的RDD,即弹性分布式数据集&#…

FL Studio 21.2.2官方中文破解版2024年最新图文安装激活教程 FL Studio 21免费激活

FL Studio 21.2.2官方中文破解版,中文别名水果编曲软件,是一款全能的音乐制作软件,包括编曲、录音、剪辑和混音等诸多功能,让你的电脑编程一个全能的录音室,它为您提供了一个集成的开发环境,使用起来非常简…

【stm32】I2C通信外设

【stm32】I2C通信外设 概念部分 如果简单应用,选择软件I2C。如果对性能指标要求比较高 选择硬件I2C 有硬件电路自动反转引脚电平,软件只需要写入控制寄存器CR和数据寄存器DR 为了实时监控时序的状态,还要读取状态寄存器SR 写入控制寄存器CR…

06-kafka及异步通知文章上下架

kafka及异步通知文章上下架 1)自媒体文章上下架 需求分析 2)kafka概述 消息中间件对比 特性ActiveMQRabbitMQRocketMQKafka开发语言javaerlangjavascala单机吞吐量万级万级10万级100万级时效性msusmsms级以内可用性高(主从)高(主从&#…

【数据库】MySQL InnoDB存储引擎详解 - 读书笔记

MySQL InnoDB存储引擎详解 - 读书笔记 InnoDB 存储引擎概述InnoDB 存储引擎的版本InnoDB 体系架构内存缓冲池LRU List、Free List 和 Flush List重做日志缓冲(redo log buffer)额外的内存池 存储结构表空间系统表空间独立表空间通用表空间undo表空间临时…

力扣---反转链表 II ***

给你单链表的头指针 head 和两个整数 left 和 right &#xff0c;其中 left < right 。请你反转从位置 left 到位置 right 的链表节点&#xff0c;返回 反转后的链表 。 示例 1&#xff1a; 输入&#xff1a;head [1,2,3,4,5], left 2, right 4 输出&#xff1a;[1,4,3,…

【QT入门】 Qt代码创建布局综合运用:仿写腾讯会议登陆界面

往期回顾&#xff1a; 【QT入门】 Qt代码创建布局之水平布局、竖直布局详解-CSDN博客 【QT入门】 Qt代码创建布局之栅格布局详解-CSDN博客 【QT入门】 Qt代码创建布局之分裂器布局详解-CSDN博客 【QT入门】 Qt代码创建布局综合运用&#xff1a;仿写腾讯会议登陆界面 一、界面分…

rust 面向对象编程特性、模式与模式匹配、高级特征

面向对象编程OOP 学习了结构体、枚举&#xff0c;它们可以包含自定义数据字段&#xff0c;也可以定义内部方法&#xff0c;它们提供了与对象相同的功能。 面向对象的四大特征&#xff1a;封装、继承、多态 通过pub标记为公有的结构体&#xff0c;在其他模块中可以访问使用这…

redis主从复制与哨兵模式

redis主从复制 Redis主从复制&#xff08;Redis replication&#xff09;是Redis提供的一种数据备份和故障转移机制。通过主从复制&#xff0c;可以将一个Redis服务器&#xff08;主节点&#xff09;的数据复制到一个或多个Redis服务器&#xff08;从节点&#xff09;。这样做…

算法设计与分析实验报告java实现(排序算法、三壶谜题、交替放置的碟子、带锁的门)

一、 实验目的 1&#xff0e;加深学生对算法设计方法的基本思想、基本步骤、基本方法的理解与掌握&#xff1b; 2&#xff0e;提高学生利用课堂所学知识解决实际问题的能力&#xff1b; 3&#xff0e;提高学生综合应用所学知识解决实际问题的能力。 二、实验任务 1、排序算法…

ctf_show笔记篇(web入门---jwt)

目录 jwt简介 web345&#xff1a; web346&#xff1a; web347&#xff1a; web348: web349&#xff1a; web350&#xff1a; jwt简介 JSON Web Token&#xff08;JWT&#xff09;通常由三部分组成 Header&#xff08;头部&#xff09;&#xff1a;包含了两部分信息&…

使用 Clickhouse 集成的表引擎同步数据方式详解

Clickhouse作为一个列式存储分析型数据库&#xff0c;提供了很多集成其他组件的表引擎数据同步方案。 官网介绍 一 Kafka 表引擎 使用Clickhouse集成的Kafka表引擎消费Kafka写入Clickhouse表中。 1.1 流程图 1.2 建表 根据上面的流程图需要建立三张表&#xff0c;分别Click…

Jenkins 安装部署

1、安装下载 官网地址&#xff1a;Jenkins 下载 war 包 1、前置环境 JDK 环境&#xff08;根据 Jenkins 版本不同&#xff0c;需要的 JDK 版本不同&#xff0c;目前需要 JDK11 的版本来支持&#xff09;Maven maven 官网下载压缩包 &#xff0c;并将其传输到服务器&#xf…

一、OpenCV(C#版本)环境搭建

一、Visual Studio 创建新项目 二、选择Windows窗体应用&#xff08;.NET Framework&#xff09; 直接搜索模板&#xff1a;Windows窗体应用(.NET Framework) 记得是C#哈&#xff0c;别整成VB(Visual Basic)了 PS&#xff1a;若搜索搜不到&#xff0c;直接点击安装多个工具和…

【Linux】线程概念及线程互斥

目录 线程概念 线程优点 线程缺点 线程异常 线程系统编程接口 线程创建及终止 线程等待 使用线程系统接口封装一个小型的C线程库并实现一个抢票逻辑 线程互斥 互斥量的接口 线程互斥实现原理 使用系统加锁接口封装LockGuard 实现自动化加锁 线程安全和可重入函数 …

Win10文件夹共享(有密码的安全共享)(SMB协议共享)

前言 局域网内&#xff08;无安全问题&#xff0c;比如自己家里wifi&#xff09;无密码访问&#xff0c;参考之前的操作视频 【电脑文件全平台共享、播放器推荐】手机、电视、平板播放硬盘中的音、视频资源 下面讲解公共网络如办公室网络、咖啡厅网络等等环境下带密码的安全…

探寻马来西亚服务器托管的优势与魅力

随着全球跨境业务的不断增加&#xff0c;境外服务器成为越来越受欢迎的选择。在这其中&#xff0c;马来西亚服务器备受关注&#xff0c;其机房通常位于马来西亚首都吉隆坡。对于客户群体主要分布在东南亚、澳大利亚和新西兰等地区的用户来说&#xff0c;马来西亚服务器是一个理…