Java 递归详解
递归详解:
1.递归一句话通俗讲就是一个方法自动重复调用自己的过程。
2.因为是重复调用自己了,所以看起来像一个循环,所以为了避免内存溢出系统崩溃,我们需要在方法里加一个返回值判断,用于递归循环的跳出。
下面用debug模式解释一下递归的实现原理:
首先是源码:
public class Demo8 {
public static void main(String[] args) {
System.out.println(sum(1));
}
/**
* @param 求和方法
*/
public static int sum(int num){
if(num == 100){
return 100;
}
return num + sum(num+1);
}
}
我们在代码第5行调用sum实现求和1到100的值
在代码中11、12行是跳出递归的if,跳出的值是100。
代码中第14行就是递归的实现写法。
现在我们用debug模式分析一下:
第一步:
首先我们运行了debug调试,在debug中可以看到已经调用实例了一个sum的方法,可以在右边Value中看到方法里的参数值正是我们输入的1。现在进入到方法内部正执行到if判断中,由于num值不是100,所以没有执行if里的return 100; 程序将继续向下运行。
第二步:
我们可以看到代码里的第14行参数值 1 已经保存在num里,代码将继续运行到sum(num+1),我们将目光在看到上面debug调试框里可以看到又创建了一个sum方法,我们将目光看到右边Value里的值是2,那是因为num里的值自增+1的结果.所以当前num 的值等于2并且保存到第二个sum方法里的num里。
那么可以继续思考下去,后面继续是第二个sum方法里将会创建第三个sum方法,第三个sum方法里将会创建第四个sum方法,创建后自增的值都会保存到当前sum方法里的int num里。
让我们来看一下动图效果:
最终运行到100次后,if会将100的值返回,方法就不会继续执行到第14行,所以就不会在创建新的sum方法了。递归也就跳出了。让我们看一下动图:
我们可以看到当num里的值自增到100以后,if方法执行了,返回了一个100的值递归被直接跳出了,那么后续代码在执行什么呢?后续代码将继续执行每一个sum方法里的num值的相加,你也可以清楚的看到每一个被实例的sum方法被消除。直到全部相加完毕。最终的值我们可也可以在Value里或者控制台里看到是5050。
Java 递归详解的更多相关文章
- Java虚拟机详解----JVM常见问题总结
[声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/4 ...
- Java ClassLoad详解
Java ClassLoad详解 类加载器是 Java 语言的一个创新,也是 Java 语言流行的重要原因之一.它使得 Java 类可以被动态加载到 Java 虚拟机中并执行.类加载器从 JDK 1. ...
- java关键字(详解)
目录 1. 基本类型 1) boolean 布尔型 2) byte 字节型 3) char 字符型 4) double 双精度 5) float 浮点 6) int 整型 7) long 长整型 8) ...
- Java ClassLoader详解(转载)
Java ClassLoader详解 类加载器是 Java 语言的一个创新,也是 Java 语言流行的重要原因之一.它使得 Java 类可以被动态加载到 Java 虚拟机中并执行.类加载器从 JDK ...
- Java集合详解6:这次,从头到尾带你解读Java中的红黑树
<Java集合详解系列>是我在完成夯实Java基础篇的系列博客后准备开始写的新系列. 这些文章将整理到我在GitHub上的<Java面试指南>仓库,更多精彩内容请到我的仓库里查 ...
- Java集合详解2:一文读懂Queue和LinkedList
<Java集合详解系列>是我在完成夯实Java基础篇的系列博客后准备开始写的新系列. 这些文章将整理到我在GitHub上的<Java面试指南>仓库,更多精彩内容请到我的仓库里查 ...
- Java方法详解
Java方法详解 什么是方法? Java方法是语句的集合,它们在一起执行一个功能. 方法是解决一类问题的步骤的有序组合 方法包含于类或对象中 方法在程序中被创建,在其他地方被引用 示例: packag ...
- Java内部类详解
Java内部类详解 说起内部类这个词,想必很多人都不陌生,但是又会觉得不熟悉.原因是平时编写代码时可能用到的场景不多,用得最多的是在有事件监听的情况下,并且即使用到也很少去总结内部类的用法.今天我们就 ...
- 黑马----JAVA迭代器详解
JAVA迭代器详解 1.Interable.Iterator和ListIterator 1)迭代器生成接口Interable,用于生成一个具体迭代器 public interface Iterable ...
随机推荐
- SpringBoot入门学习笔记
SpringBoot是SpringMVC的升级版,SpringBoot的特点: application.properties文件配置: server.port = 8080端口配置 server.co ...
- ubuntu base make 未找到命令
引用:https://blog.csdn.net/fenglibing/article/details/7096556 1.先放入UBUNTU安装盘到光盘中: 2.再按顺序执行以下的命令: sudo ...
- line-height的理解
font-size:0清除display:inline-block元素换行符间隙,比如两个img标签之间有换行符 行内元素的高度是由其行高决定的. Div或者其他元素内的图片,底部会有间隙,原因是图片 ...
- js 格式化时间日期函数小结
下面是脚本之家为大家整理的一些格式化时间日期的函数代码,需要的朋友可以参考下. 代码如下: Date.prototype.format = function(format){ var o = { &q ...
- mysql获取某个表的所有属性名及其数据
MYSQL类实现从数据库相应的表中获取所有属性及其数据,数据为元组类型.返回结果存放在字典中 import pymysql class MYSQL: def __init__(self): pass ...
- Bitmap BitmapData
var sp:Sprite=new Sprite(); sp.graphics.beginFill(0xffccdd); sp.graphics.drawRect(0,0,100,100); sp.g ...
- LinkedList的自定义实现
一.背景 LinkedList双向链表: 代码: Node.java: package com.cy.collection; public class Node { Node previous; // ...
- GO中DEFER的理解--DEFER执行的原理
在golang当中,defer代码块会在函数调用链表中增加一个函数调用.这个函数调用不是普通的函数调用,而是会在函数正常返回,也就是return之后添加一个函数调用.因此,defer通常用来释放函数内 ...
- [UE4]虚幻4链接独立服务器
如果虚幻4只做客户端的话,应该怎么连接服务器呢? 官方并没有提供蓝图的网络函数,C++里面有. 一.自己实现,提供接口给蓝图使用. 二.第三方插件.插件下载地址:https://github.com/ ...
- Android应用启动会白屏一下的解决办法
设置透明样式,如下:<activity android:name="com.hongfans.cvi.ui.MainActivity" android:configChang ...