二话不说,先上代码

Java代码

publicclassTestRecursion{

//递归方法

publicstaticvoidfun(inti){

if(i >0){

i--;

fun(i);

System.out.print(i);

}

System.out.print(" ok ");

}

publicstaticvoidmain(String args[]){

fun(10);

}

}

public class TestRecursion{

//递归方法

public static void fun(int i){

if(i > 0){

i--;

fun(i);

System.out.print(i);

}

System.out.print(" ok ");

}

public static void main(String args[]){

fun(10);

}

}

这段代码看似简单,其中的奥秘你却未必尽知。

首先.什么是递归?相信大家都知道,就是方法直接或间接地调用自身。

要想深入理解递归,得从栈的角度去看待方法间的调用。

先来看一个简单的例子:

Java代码

publicvoida(){}

publicvoidb(){

System.out.println("Hello");

a();

System.out.println("boy");

}

public void a(){}

public void b(){

System.out.println("Hello");

a();

System.out.println("boy");

}

方法b()调用了方法a(),此时程序不再顺序执行,而是发生跳转。CPU首先将下一条机器指令的地址以及相关的参数信息压入栈中,然后程序跳转到a()的方法体中。当a()方法返回时,CPU会执行出栈操作,取出上一次存储的机器指令的地址以及参数信息,即System.out.println("boy")(当然了,System.out.println()不是一条机器指令,而是被翻译成多条机器指令)

递归方法也是一个道理,只不过,调用者与被调用者是同一个方法。

递归与循环的有些相似,但又截然不同。循环没有方法间的调用关系,也就没有指令地址的压栈、出栈,它仅仅指令地址的改变。

现贴出TestRecursion小程序的输出结果:

Java代码

ok0ok1ok2ok3ok4ok5ok6ok7ok8ok9ok

ok 0 ok 1 ok 2 ok 3 ok 4 ok 5 ok 6 ok 7 ok 8 ok 9 ok

分析调用过程:fun(10)->fun(9)->fun(8)->fun(7)->fun(6)->fun(5)->fun(4)->fun(3)->fun(2)->fun(1)->fun(0)

我们倒过来分析:当i=0时,首次不满足i>0的条件,所以首先打印“ok"。然后fun(0)结束了,返回到fun(1)中,执行调用fun(0)的下一条语句,即System.out.print(i),此时i=0.肯定有的朋友不明白为什么这里i=0.看下面的代码

Java代码

publicstaticvoidfun(inti){//此时i==1

if(i >0){//yes

i--;//此时i==0了

fun(i);//即fun(0)

System.out.print(i);//i==?

}

System.out.print(" ok ");

}

public static void fun(int i){//此时i==1

if(i > 0){//yes

i--; //此时i==0了

fun(i);//即fun(0)

System.out.print(i);//i==?

}

System.out.print(" ok ");

}

继续分析:打印"0",又打印" ok ",之后fun(1)方法结束了,返回到fun(2)调用fun(1)的下一条语句,System.out.print(i),此时i=1,依次类推。

java中的递归算法_java递归实现相关推荐

  1. java中的递归算法_java递归算法实例分析

    递归算法设计的基本思想是: 对于一个复杂的问题,把原问题分解为若干个相对简单类同的子问题,继续下去直到子问题简单到能够直接求解,也就是说到了递推的出口,这样原问题就有递推得解. 在做递归算法的时候,一 ...

  2. java全排列算法 递归算法_Java递归实现全排列

    最近整理之前自己学习Java时的一些代码笔记,可能都是一些比较基础的Java知识,在这里只是给需要的人参考一下. 递归算法:将数据分为两部分,递归将数据从左侧移右侧实现全排列 package inte ...

  3. java中的递归算法_java中的递归算法

    import java.math.BigDecimal; /** * 递归计算1+2+3+...+100 * * @author dell * */ public class Test { publi ...

  4. Java中的无限层级递归树前后端操作解决方案

    引言: 抖音真是一个神奇的软件,前两天脑海中浮现了一首歌,知道歌曲的调调,今天打算写博客之前刷了一下抖音,抖音的推荐算法居然给我推送了这首歌,这首歌叫做<一开始说陪你到老的人现在他还好吗> ...

  5. Java中的堆栈安全递归

    在本文中,摘自< Java中的函数式编程 >一书,我解释了如何使用递归,同时避免了StackOverflow异常的风险. Corecursion正在使用第一步的输出作为下一步的输入来构成计 ...

  6. Java中的迭代与递归

    递归 提到迭代,不得不提一个数学表达式: n!=n*(n-1)*(n-2)*...*1 有很多方法来计算阶乘.有一定数学基础的人都知道n!=n*(n-1)!因此,代码的实现可以直接写成: 代码一 in ...

  7. java中fork函数_java中的forkjoin框架的使用

    fork join框架是java 7中引入框架,这个框架的引入主要是为了提升并行计算的能力. fork join主要有两个步骤,第一就是fork,将一个大任务分成很多个小任务,第二就是join,将第一 ...

  8. java中properties类_Java中的Properties类详解

    1.Properties类是什么? Properties(Java.util.Properties),该类主要用于读取Java的配置文件,不同的编程语言有自己所支持的配置文件,配置文件中很多变量是经常 ...

  9. java中collection方法_Java 8中的Collector toCollection()方法

    toCollection()Java中的Collector类的方法返回一个Collector,该Collector以遇到的顺序将输入元素累积到一个新的Collection中. 语法如下static & ...

最新文章

  1. MUV LUV EXTRA 2019CCPC秦皇岛站J题 KMP
  2. 本地html app跨域,本地webapp是怎么解决跨域问题的?
  3. 别人给你网盘分享东西怎么搞到电脑上看呢?
  4. 知识梳理——CSS篇
  5. oracle检查外键依赖,Oracle中检查外键是否有索引的SQL脚本分享
  6. linux 命令速查手册之十
  7. 前端的深拷贝和浅拷贝_javascript中的深拷贝和浅拷贝?
  8. ASP.NET Core 中文文档 第二章 指南(4.10)检查自动生成的Detail方法和Delete方法
  9. Linux虚拟机下mysql 5.7安装配置方法图文教程
  10. 实例集群状态为Fail导致的集群混乱排查和复现
  11. WebCollector 简介与 快速入门
  12. bzero函数_Poll 函数
  13. CS224N 笔记一
  14. java emf 转jpg_java – emf到jpg的转换
  15. Android Studio 报错:Incompatible types
  16. 谷歌SEO入门的基础知识
  17. 立创eda学习笔记二十二:如何修改pcb网络颜色?
  18. 线性插值函数的基函数构造
  19. 到底该不该用RTOS,这篇文章给你答案!
  20. PHP代码从数据库中获取数据

热门文章

  1. 让天嵌的E9板通过网线与能上网的笔记本连接实现联网
  2. Memcached的LRU策略
  3. sql语句进阶教程(学习sql这一篇就够了)
  4. arduino 1 读取电机编码器值
  5. wps不能粘贴解决办法
  6. 深剖函数重载——C++基础篇
  7. Spring Init Destory
  8. sv常用的系统function/task(一)
  9. Filecoin系列 - 源码分析 - CPU SHA扩展
  10. 计算机休眠按钮是哪个,电源按钮设置成睡眠好还是休眠好?