Java 递归重难点分析详解与练习
目录
- 递归是什么
- 分析递归的过程
- 递归练习
- 按顺序打印一个数的每一位
递归是什么
就是一个方法在执行的时候,自己调用自己。
递归的要求:
1 有一个趋近于终止的条件
2 实现递归要去推导出一个递推公式
递归就是递下去,归上来。求 5 的阶乘,代码举例:
public static int fact(int n){ if(n == 1){ return n; } return n*fact(n - 1); } public static void main(String[] args) { int n = 5; int ret = fact(n); System.out.println(ret); }
这里的终止条件就是 n 等于 1 时,返回 1 就停止递归了。否则一直递归下去会造成栈区的溢出。
分析递归的过程
这里就分析上面这个代码的递归过程。
如上图,这就是上面这段递归代码的递归过程,先传入 5 不符合 if 条件。所以继续递归,直到递归到 n == 1 的时候,此时不再递归,而是返回 1 .至此,递下去结束。开始归回来,归回来的时候,最后返回 1 ,然后一路返回,直到最后一个 return 结束,也就是返回 120 。
递归练习
按顺序打印一个数的每一位
例如:1234 打印出 1 2 3 4 代码示例:
public static void print1(int n){ if(n == 0){ return; } print1(n / 10); System.out.print(n % 10+" "); } public static void main(String[] args) { int n = 1234; print1(n); }
整个递归过程如下所示:
到此这篇关于Java 递归重难点分析详解的文章就介绍到这了,更多相关Java 递归内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!
相关推荐
-
Java 递归遍历实现linux tree命令方式
目录 Java 递归遍历实现linux tree命令 递归调用的函数traversal printName函数 java实现zTree的遍历 Java 递归遍历实现linux tree命令 看到介绍java file类的文章,有一个遍历文件夹的练习,遍历某个目录下所有文件,包括子目录.写了一个用栈实现的递归遍历. import java.io.File; import java.util.Stack; public class TraversalFile { public static void
-
Java使用递归回溯完美解决八皇后的问题
八皇后问题 八皇后问题,是一个古老而著名的问题,是回溯算法的典型案例.该问题是国际西洋棋棋手马克斯·贝瑟尔于1848年提出:在8X8格的国际象棋上摆放八个皇后,使其不能互相攻击,即:任意两个皇后都不能处于同一行.同一列或同一斜线上,问有多少种摆法. 解决思路 ①第一个皇后先放第一行第一列. ②第二个皇后放在第二行第一列.然后判断是否OK,如果不0K, 继续放在第二列.第三列.依次把所有列都放完,找到一个合适. ③继续第三个皇后, 还是第一列.第二列-直到第8个皇后也能放在一个不冲突的位置,算是找
-
java非递归实现之二叉树的前中后序遍历详解
二叉树的前中后序遍历 核心思想:用栈来实现对节点的存储.一边遍历,一边将节点入栈,在需要时将节点从栈中取出来并遍历该节点的左子树或者右子树,重复上述过程,当栈为空时,遍历完成. 前序遍历 //非递归 //根 左 右 class Solution { public List<Integer> preorderTraversal(TreeNode root) { //用数组来存储前序遍历结果 List<Integer> list = new ArrayList<>(); i
-
Java 关于递归的调用机制精细解读
目录 1. 基本介绍: 2. 递归能解决什么问题? 3. 递归举例分析: 3.1 打印问题: 3.2 阶乘问题: 递归的重要规则: 方法的递归调用 1. 基本介绍: 简单地说,递归就是方法自己调用自己,每次调用时传入不同的变量,递归有助于编程者解决复杂问题的同时让代码变得简洁,化繁为简是其核心思想. 2. 递归能解决什么问题? 各种经典数学问题,如:八皇后问题,汉诺塔(河内塔),阶乘问题,迷宫问题,青蛙跳台阶,球和篮子的问题(Google编程大赛): 各种算法中也会使用到递归思想,比如快速排序(
-
java递归实现拼装多个api的结果操作方法
工作需要,经常需要实现api接口,但每次都是大同小异,我就考虑是否可以将这种重复性的工作配置化. 我就写一个模板api,然后所有的HTTP请求过来,根据不同的配置返回不同结果. 最开始考虑的是比较简单的,来一个api需求,我就去MySQL查一条这个api对应的SQL,然后拿SQL去取结果,返回. 这个不难. 关键是实际需求中,有很多api返回的数据很复杂,比如渲染地图的接口,一般一条SQL搞不定. 那我就想,那我能不能实现api的拼装呢,你看到我只是调用了一个API,但是我给你返回的结果,其实是
-
Java 递归查询部门树形结构数据的实践
说明:在开发中,我们经常使用树形结构来展示菜单选项,如图: 那么我们在后端怎么去实现这样的一个功能呢? 1.数据库表:department 2.编写sql映射语句 <select id="selectDepartmentTrees" resultType="com.welb.entity.Department"> select * from department <where> <if test="updepartmentco
-
Java程序中方法的用法重载和递归
目录 前言 一.方法的基本用法 1.什么是方法 2.方法的基本定义 3.方法调用的执行过程 4.方法中的实参和形参 二.方法的重载 1.重载的概念 2.例题分析 三.方法的递归 1.递归定义 2.例题分析 3.递归应用场景 总结 前言 "方法"又被称为"函数",其他的编程语言也有这个概念,重要性不言而喻,在这个文章,将介绍如何定义和使用方法. 一.方法的基本用法 1.什么是方法 在Java中,方法定义在类中,它和类的成员属性(数据成员)一起构建一个完整的类.构成方法
-
Java 递归重难点分析详解与练习
目录 递归是什么 分析递归的过程 递归练习 按顺序打印一个数的每一位 递归是什么 就是一个方法在执行的时候,自己调用自己. 递归的要求: 1 有一个趋近于终止的条件 2 实现递归要去推导出一个递推公式 递归就是递下去,归上来.求 5 的阶乘,代码举例: public static int fact(int n){ if(n == 1){ return n; } return n*fact(n - 1); } public static void main(String[] args) { int
-
Java CompletableFuture实现原理分析详解
目录 简介 CompletableFuture类结构 CompletableFuture回调原理 CompletableFuture异步原理 总结 简介 前面的一篇文章你知道Java8并发新特性CompletableFuture吗?介绍了CompletableFuture的特性以及一些使用方法,今天我们主要来聊一聊CompletableFuture的回调功能以及异步工作原理是如何实现的. CompletableFuture类结构 1.CompletableFuture类结构主要有两个属性 pub
-
深入java内存查看与分析详解
1:gc日志输出在jvm启动参数中加入 -XX:+PrintGC -XX:+PrintGCDetails -XX:+PrintGCTimestamps -XX:+PrintGCApplicationStopedTime,jvm将会按照这些参数顺序输出gc概要信息,详细信息,gc时间信息,gc造成的应用暂停时间.如果在刚才的参数后面加入参数 -Xloggc:文件路径,gc信息将会输出到指定的文件中.其他参数还有-verbose:gc和-XX:+PrintTenuringDistribution等.
-
Java逃逸分析详解及代码示例
概念引入 我们都知道,Java 创建的对象都是被分配到堆内存上,但是事实并不是这么绝对,通过对Java对象分配的过程分析,可以知道有两个地方会导致Java中创建出来的对象并一定分别在所认为的堆上.这两个点分别是Java中的逃逸分析和TLAB(Thread Local Allocation Buffer)线程私有的缓存区. 基本概念介绍 逃逸分析,是一种可以有效减少Java程序中同步负载和内存堆分配压力的跨函数全局数据流分析算法.通过逃逸分析,Java Hotspot编译器能够分析出一个新的对象的
-
Java AbstractMethodError案例分析详解
背景 AbstractMethodError异常对于我来说还是比较不常遇见的,最近有幸遇到,并侥幸的解决了,在这里把此种场景剖析一番,进入正题,下面是AbstractMethodError在Java的异常机制中所处的位置: 现在明确了AbstractMethodError所具有的特性: 1.它是Error的子类,Error类及其子类都是被划分在非检查异常之列的,就是说这些异常不能在编译阶段被检查出来,只能在运行时才会触发. 2.通过API文档里面的解释大致得出的结论就是说A依赖于B,但是执行的时
-
java面向对象设计原则之迪米特法则分析详解
目录 概念 使用 拓展 概念 迪米特法则解决类与类之间耦合度问题,如果类A调用了B类的某一个方法,则这两个类就形成了一种紧耦合的方式,当B类这个方法发生变化时,一定会影响A类的执行结果.迪米特法则要求每一个类尽可能少的与其他类发生关系,也就是尽可能少的让其他类发生变化时,对其代码的执行结果产生的影响降到最低. 典型情况:A类调用B类的方法,B类和C类是一种关联关系,如果A类通过B类所持有的C类对象直接调用C类的方法,则A类和C类同时拥有强耦合的关系.代码如下: public class B {
-
java方法及this关键字原理分析详解
目录 步骤1 .给顾客增加一个吃饭的方法 步骤 2 . 没有加static的属性和方法,一定需要先new对象 步骤 3 . 用new出来的对象去执行eat方法 步骤 4 . 怎么理解c.eat() 步骤 5 . 消息接受器 步骤 6 . 如果有两个顾客? 步骤 7 . 答案 步骤 8 .其实有个this 步骤 9 . 在eat方法里面直接使用this 步骤 10 . 构造方法 步骤 11 . 总结:this的意义是什么? 步骤 12 . 道理我都懂,那static又是什么? 步骤 13 . 本节
-
Java 数据结构中二叉树前中后序遍历非递归的具体实现详解
目录 一.前序遍历 1.题目描述 2.输入输出示例 3.解题思路 4.代码实现 二.中序遍历 1.题目描述 2.输入输出示例 3.解题思路 4.代码实现 三.后序遍历 1.题目描述 2.输入输出示例 3.解题思路 4.代码实现 一.前序遍历 1.题目描述 给你二叉树的根节点 root ,返回它节点值的 前序 遍历. 2.输入输出示例 示例 1: 输入:root = [1,null,2,3] 输出:[1,2,3] 示例2: 输入:root = [] 输出:[] 示例 3: 输入:root = [1
-
Java中注解与原理分析详解
目录 一.注解基础 二.注解原理 三.常用注解 1.JDK注解 2.Lombok注解 四.自定义注解 1.同步控制 2.类型引擎 一.注解基础 注解即标注与解析,在Java的代码工程中,注解的使用几乎是无处不在,甚至多到被忽视: 无论是在JDK源码或者框架组件,都在使用注解能力完成各种识别和解析动作:在对系统功能封装时,也会依赖注解能力简化各种逻辑的重复实现: 基础接口 在Annotation的源码注释中有说明:所有的注解类型都需要继承该公共接口,本质上看注解是接口,但是代码并没有显式声明继承关
-
分析详解python多线程与多进程区别
目录 1 基础知识 1.1 线程 1.2 进程 1.3 两者的区别 2 Python 多进程 2.1 创建多进程 方法1:直接使用Process 方法2:继承Process来自定义进程类,重写run方法 2.2 多进程通信 Queue Pipe 2.3 进程池 3 Python 多线程 3.1 GIL 3.2 创建多线程 方法1:直接使用threading.Thread() 方法2:继承threading.Thread来自定义线程类,重写run方法 3.3 线程合并 3.4 线程同步与互斥锁 3
随机推荐
- VBScript获取CPU使用率的方法
- Mysql ERROR 1577错误解决方法
- JavaScript 面向对象的之私有成员和公开成员
- common-upload上传文件功能封装类分享
- asp.net实现上传文件显示本地绝对路径的实例代码
- Asp.Net实现无限分类生成表格的方法(后台自定义输出table)
- Linux下用Python脚本监控目录变化代码分享
- android 类似微信的摇一摇功能实现思路及代码
- php compact 通过变量创建数组
- js中document.referrer实现移动端返回上一页
- PHP SPL标准库之SplFixedArray使用实例
- crontab实现每隔多少天执行一次脚本的两种方法
- JQuery ajax返回JSON时的处理方式 (三种方式)
- c++中string类成员函数c_str()的用法
- float ad浮动广告代码
- 微信小程序微信支付接入开发实例详解
- win2008 IIS7无后缀URL部署问题 MVC4 MVC URL映射
- 深入串的模式匹配算法(普通算法和KMP算法)的详解
- android中图片的三级缓存cache策略(内存/文件/网络)
- 安卓(Android)中如何实现滑动导航