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 ...
随机推荐
- 配置Hanlp自然语言处理进阶
中文分词 中文分词中有众多分词工具,如结巴.hanlp.盘古分词器.庖丁解牛分词等:其中庖丁解牛分词仅仅支持java,分词是HanLP最基础的功能,HanLP实现了许多种分词算法,每个分词器都支持特定 ...
- RedHat无法ping通Win10的解决办法
1.环境 主机: win10 企业版 64位 ip地址: 192.168.168.100 虚拟机:Red Hat ip地址: 192.168.168.200 2.现象: win10系统可以ping通R ...
- padding margin
padding:内边距 margin:外边距 内外边距是针对本标签相对于它相邻的标签而言. margin: 10px;是本标签与它周围上下左右有10像素的空白. padding: 10px;本标签其实 ...
- OpenEXR的输出机制
最近在一直在研究OpenEXR这个软件.这个软件的图像输出机制很有意思,特地分享一下学习心得,就当是笔记了. 我的OpenEXR软件版本是2.2.0,系统平台是win7. 安装完毕OpenEXR之后我 ...
- gmake缺失错误
原文:http://blog.csdn.net/syh_486_007/article/details/53862831 编译nachos程序的时候发现了这样一个错误gmake: command no ...
- 廖雪峰Java1-4数组操作-2数组排序
冒泡排序法 将第一个值和后面的值,挨个比较,如果手里的值比序列的值小,就交换数据,拿新的数字继续比较,直到最后. 再将第二个值和后面的值,挨个比较. 循环往复,排序完成. int[] ns = {28 ...
- [UE4]纯函数的执行时机
一.纯函数是在需要的时候被调用 二.纯函数内不应当修改任何数据 三.如果同一个函数需要多个得到多个纯函数的返回值,则多个纯函数的调用顺序不是固定的,并且一个纯函数的调用顺序也不应当影响下一个纯函数的返 ...
- [UE4]第一人称与第三人称
一.给Character添加一个SkeletalMesh,并设置为第三人称模型.并设置自己看不到该模型. 二.添加给骨骼的右手添加一个Socket插槽用来挂载武器 三.判断当前角色是否被本地Contr ...
- CountDownLatch的简单讲解
正如每个Java文档所描述的那样,CountDownLatch是一个同步工具类,它允许一个或多个线程一直等待,直到其他线程的操作执行完后再执行.在Java并发中,countdownlatch的概念是一 ...
- 升级安装APK兼容Android7.0,解决FileUriExposedException
见http://blog.csdn.net/ruancoder/article/details/67639621?utm_source=itdadao&utm_medium=referral