33从零开始学Java之方法的递归调用到底是怎么回事?

news2024/12/28 18:51:32

作者:孙玉昌,昵称【一一哥】,另外【壹壹哥】也是我哦

千锋教育高级教研员、CSDN博客专家、万粉博主、阿里云专家博主、掘金优质作者

前言

在之前的文章中,壹哥给大家讲解了方法的定义、调用及参数、返回值等内容,接下来壹哥会综合前面所学的这些内容,给大家讲解一个方法调用时的新思路。

我们知道,A方法可以调用B方法,反之,B方法也可以调用A方法。那么有的人就问啦,A方法自己能不能调用自己?这就好比张三可以指挥李四干活,李四也可以指挥张三干活,那张三自己能不能指挥自己干活呢?其实在Java中,是允许一个方法自己调用自己的,这就是递归!

-------------------------------------------------前戏已做完,精彩即开始-----------------------------------------------

全文大约【1600】字,不说废话,只讲可以让你学到技术、明白原理的纯干货!本文带有丰富的案例及配图视频,让你更好地理解和运用文中的技术概念,并可以给你带来具有足够启迪的思考......

配套开源项目资料

Github:

GitHub - SunLtd/LearnJava

Gitee:

一一哥/从零开始学Java

一. 递归

1. 简介

所谓的递归,其实是一种解决问题的方式。就是在解决具有既定规律的问题时,在方法内部调用方法自身的一种编程方式即方法在运行的过程中,不断地自己调用自己,通过每次传入不同的参数来解决复杂的问题。递归分为两个过程,简单地说一个是递的过程,一个是归的过程。

2. 使用场景

那我们什么时候使用递归呢?这里有几个常见的使用场景供大家参考:

  • 当一个需要解决的大问题可以拆分成若干个小问题,大小问题的解决方式相同,方法中就可以自己调用自己;
  • 可以使用循环解决的常规问题,基本都可以替换为递归进行解决;
  • 原问题和拆分后的子问题除了数据规模不同,解决思路完全相同。

3. 特点

递归具有逻辑性强、可读性好,以及代码简洁的优点。同时也有一些缺点,比如由于递归需要用到栈结构,所以占用的空间较大,有可能会发生栈溢出。另外可能存在重复计算的问题,需要进行一定的优化。

4. 基本用法

如果我们要想实现递归,其实是很简单的,直接在A方法里面调用A方法就可以了,如下所示:

methodA(){
    //递归调用
    methodA();
}

但是我们要注意到底该什么时候使用递归,且在使用递归时,还要设置有效的出口条件,让调用链上的每个方法都可以正确返回,避免无限递归,不能没完没了。所以一个合理的递归,必须具备两个条件:

  • 一是要有边界,即终止条件;
  • 二是要自己调用自己。

5. 三大要素

在使用递归之前,我们需要明确使用递归时的三大要素:

  1. 明确方法想要实现的功能;
  2. 确定递归结束的条件。我们需要确定当满足什么条件时递归会结束,并把结果返回;
  3. 找出方法的等价关系式。我们可以不断缩小参数的范围,之后通过一些辅助的变量或操作,使原方法的结果保持不变。

6. 代码案例

接下来壹哥通过几个案例来给大家演示递归的使用。

6.1 计算阶乘

大家应该都听过阶乘的概念,那么如何通过代码实现阶乘的效果呢?我们先来看下图,复习一下阶乘的实现过程。

了解了阶乘的实现过程之后,我们会发现,其实阶乘每一步的实现过程都是类似的。所以计算某个数字阶乘结果的大问题,就可以转化为若干个小问题。比如计算5的阶乘,其实就是分别单独计算出1的阶乘,2的阶乘,3的阶乘....每一个步骤都类似,无非就是计算的数字不同。这种情境下,我们就可以使用递归来解决问题,实现代码如下:

/**
 * @author 一一哥Sun
 * QQ:2312119590
 * CSDN、掘金、知乎找我哦
 * 千锋教育
 */
public class Demo07 {
	public static void main(String[] args) {
		int result = jc(5);
		System.out.println("result="+result);
	}
	
	//案例:求某个数的阶乘,如5! = 5*4! 
	public static int jc(int num) {
		//如果数字是1,则直接返回1
	    if(num == 1) {
	        return 1;
	    }
	    
	    //递归调用,将返回的结果与num相乘
	    return num*jc(num-1);
	}
}

6.2 输出数字中每一位上的值

接下来我们再通过第二个案例来加深对递归的理解。这个案例是换行输出数字中每一位上的值,如把1234的每一个数字分别输出。

/**
 * @author 一一哥Sun
 * QQ:2312119590
 * CSDN、掘金、知乎找我哦
 * 千锋教育
 */
public class Demo08 {
	public static void main(String[] args) {
		printNum(1234);
	}
	
	//换行输出一个数字中每一位上的值,如把1234的每一个数字分别输出。
	public static void printNum(int num) {
        //如果是0,直接终止
	    if(num == 0) {
	        return;
	    }
	    
	    //换行输出每一位的数字
	    System.out.println(num % 10);
	    
	    //递归调用
	    printNum(num/10);
	}
}

现在通过以上两个案例,你知道递归是如何使用的了吗?

-------------------------------------------------正片已结束,来根事后烟-----------------------------------------------

二. 结语

至此,壹哥就把递归讲解完毕了,其实递归主要就是一种方法的实现方式,大家稍微琢磨一下就明白了。最主要的还是要多写多练,代码写多了,我们思维上的认知障碍就会自动消失。如果你独自学习觉得有很多困难,可以加入壹哥的学习互助群,大家一起交流学习。

三. 今日作业

1. 第一题

用代码计算斐波那契数列的第n项。

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

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

相关文章

广告行业中那些趣事系列62:keybert在实际业务中的使用分享

导读:本文是“数据拾光者”专栏的第六十二篇文章,这个系列将介绍在广告行业中自然语言处理和推荐系统实践。本篇作为之前keybert的补充主要介绍了keybert在实际业务中的使用分享,对于希望在实际业务场景中使用keybert的小伙伴可能有帮助。 欢…

微信小程序-页面生命周期方法

在经过上一篇文章的介绍之后&#xff0c;我们知道了大体的生命周期在什么时候执行&#xff0c;这次主要是以代码的形式来展示一下具体的阶段执行什么生命周期方法。 首先我们编写一个代码可以从首页跳转到日志页面&#xff1a; <!--index.wxml--> <text>首页</t…

项目中excel表格中由合同内容--转换为验收清单的办法(python操作excel表格)

需求&#xff1a; 把合同内容--转换为验收清单的办法&#xff08;python操作excel表格&#xff09; 1.字段重新排序 2.选择需要的表格列 原始的表格内容&#xff1a; 需要的格式&#xff1a; 涉及的技术点&#xff1a; 1.读取原始表格“readexcel1.xlsx”内容&#xff0c;修改…

第十一章 Productions最佳实践 - 生产电子表格

文章目录 第十一章 Productions最佳实践 - 生产电子表格生产电子表格界面设计 第十一章 Productions最佳实践 - 生产电子表格 生产电子表格 维护一个电子表格是很有帮助的&#xff0c;它可以逐个应用程序地组织信息系统。作为一般准则&#xff0c;应该为每个提供传入或传出数…

# 性能诊断 JProfiler 工具使用

性能诊断 JProfiler 工具使用 JProfiler是一个重量级的JVM监控工具&#xff0c;提供对JVM精确监控&#xff0c;其中堆遍历、CPU剖析、线程剖析看成定位当前系统瓶颈的得力工具。可以统计压测过程中JVM的监控数据&#xff0c;定位性能问题。 官网地址&#xff1a;Java Profiler…

初识linux之网络基础概念

目录 一、网络发展 1. 独立模式 2. 网络互联 二、认识协议 1. 为什么要有协议 2. 什么是协议 三、网络协议初识 1. 协议分层 2. 协议分层的优点 3. 理解分层 4. OSI七层模型 4.1 概念 4.2 模型形式 4.3 各层的作用 5. TCP/IP五层&#xff08;或四层&#xff09…

书评 | 《深入理解高并发编程:JDK核心技术》

书评 | 《深入理解高并发编程&#xff1a;JDK核心技术》 作者简介 冰河&#xff1a;互联网资深技术专家、数据库技术专家、分布式与微服务架构专家&#xff1b;多年来一直致力于分布式系统架构、微服务、分布式数据库、分布式事务与大数据技术的研究&#xff0c;在高并发、高可…

MySQL高级篇——关联查询和子查询优化

导航&#xff1a; 【黑马Java笔记踩坑汇总】Java基础进阶JavaWebSSMSpringBoot瑞吉外卖SpringCloud黑马旅游谷粒商城学成在线设计模式牛客面试题 目录 1. 关联查询优化 1.0 优化方案 1.1 数据准备 1.2 左外连接&#xff1a;优先右表创建索引&#xff0c;连接字段类型要一致…

numpy-stl实战3D建模【Python】

想象一下&#xff0c;我们需要用 python 编程语言构建某个物体的三维模型&#xff0c;然后将其可视化&#xff0c;或者准备一个文件以便在 3D 打印机上打印。 有几个库可以解决这些问题。 让我们来看看&#xff0c;如何在 Python 中从点、边和图元构建 3D 模型。 如何执行基本的…

如何对图片进行卷积计算

1 问题 如何对图片进行卷积计算&#xff1f; 2 方法 先导入torch和torch里的nn类&#xff0c;然后设置一个指定尺寸的随机像素值的图片&#xff0c;然后使用nn.conv2d函数进行卷积计算&#xff0c;然后建立全连接层&#xff0c;最后得到新的图片的尺寸 步骤: (1) 导入实验所需要…

CyberLink的音频编辑软件AudioDirector Ultra 13.4版本在win10系统的下载与安装配置教程

目录 前言一、AudioDirector Ultra安装二、使用配置总结 前言 AudioDirector Ultra是由CyberLink公司开发的一款强大的音频编辑工具&#xff0c;旨在为用户提供全面的音频后期制作和编辑解决方案。该软件支持多种音频格式&#xff0c;包括MP3、WAV、M4A等&#xff0c;并且可以…

网络工程师精选习题详解(二)

请点击↑关注、收藏&#xff0c;本博客免费为你获取精彩知识分享&#xff01;有惊喜哟&#xff01;&#xff01; 201.通常使用&#xff08;&#xff09;为IP数据报进行加密。 A.IPSec B.PP2P C.HTTPS D.TLS 答案&#xff1a;A IP Sec可以为IP数据报进行加密。 …

【004hive基础】hive的文件存储格式与压缩

文章目录 一.hive的行式存储与列式存储二. 存储格式1. TEXTFILE2. ORC格式3. PARQUET格式 ing 三. Hive压缩格式1. mr支持的压缩格式:2. hive配置压缩的方式:2.1. 开启map端的压缩方式:2.2.开启reduce端的压缩方式: 四. hive中存储格式和压缩相结合五. hive主流存储格式性能对比…

【分立元件】MOSFET的工作原理

MOSFET适用于瓦至十数千瓦的中小功率,特别适用于电源管理行业的入门学习。IGBT和MOSFET使用相似,但属于中大功率场合才使用,如果想使用好IGBT,也要先学习MOSFET。 对于MOSFET的学习我们需要学习它的工作原理,知道MOSFET的主要参数,MOSFET的开关过程以及如何驱动MOSFET,应…

技术最强,干活最多,但不会来事,又不是嫡系,得不到领导重用,这种情况去创业公司会不会好点?...

能力强但情商不高&#xff0c;许多程序员都有这样的问题&#xff0c;这种情况怎么办&#xff1f; 一位程序员问&#xff1a; 组内技术能力最强&#xff0c;干活最多&#xff0c;解决不了的问题就会派他上&#xff0c;领导嘴上认可&#xff0c;但因为他不会来事&#xff0c;又不…

一文搞定十大排序算法

文章目录 概述冒泡排序 (Bubble Sort)算法步骤图解算法代码实现算法分析 选择排序 (Selection Sort)算法步骤算法图解代码实现算法分析 插入排序(Insertion Sort)算法步骤图解算法代码实现算法分析 希尔排序 (Shell Sort)算法步骤图解算法代码实现算法分析 归并排序 (Merge Sor…

多维时序 | MATLAB实现GA-LSTM遗传算法优化长短期记忆网络的多变量时间序列预测

多维时序 | MATLAB实现GA-LSTM遗传算法优化长短期记忆网络的多变量时间序列预测 目录 多维时序 | MATLAB实现GA-LSTM遗传算法优化长短期记忆网络的多变量时间序列预测效果一览基本介绍程序设计参考资料 效果一览 基本介绍 MATLAB实现GA-LSTM遗传算法优化长短期记忆网络的数据多…

系统集成实验模拟总公司和分公司之间通信(涉及mpls vxn,链路聚合,nat,vlan划分,单臂路由,dhcp....)

目录 一 需求描述 二 需求分析 三 实验拓扑 四 实验配置 4.1 总公司 4.1.1 vlan间通信 4.1.2 dhcp自动分配ip 配置地址池 接口开启dhcp 4.1.3 链路聚合 4.1.4 ospf实现内网通信 4.2 分公司 4.2.1 单臂路由 4.2.2 dhcp自动获取ip 4.2.3 ospf实现内网通信 4.3 mp…

判断传入数据是否为列表、数组、数据框等数据结构pd.api.types.is_list_like()

【小白从小学Python、C、Java】 【计算机等考500强证书考研】 【Python-数据分析】 判断传入数据是否为 列表、数组、数据框等数据结构 pd.api.types.is_list_like() 选择题 下列说法错误的是? import pandas as pd import numpy as np print("【执行】pd.api.ty…

基于html+css的图展示85

准备项目 项目开发工具 Visual Studio Code 1.44.2 版本: 1.44.2 提交: ff915844119ce9485abfe8aa9076ec76b5300ddd 日期: 2020-04-16T16:36:23.138Z Electron: 7.1.11 Chrome: 78.0.3904.130 Node.js: 12.8.1 V8: 7.8.279.23-electron.0 OS: Windows_NT x64 10.0.19044 项目…