java中的递归算法_java递归实现
二话不说,先上代码
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递归实现相关推荐
- java中的递归算法_java递归算法实例分析
递归算法设计的基本思想是: 对于一个复杂的问题,把原问题分解为若干个相对简单类同的子问题,继续下去直到子问题简单到能够直接求解,也就是说到了递推的出口,这样原问题就有递推得解. 在做递归算法的时候,一 ...
- java全排列算法 递归算法_Java递归实现全排列
最近整理之前自己学习Java时的一些代码笔记,可能都是一些比较基础的Java知识,在这里只是给需要的人参考一下. 递归算法:将数据分为两部分,递归将数据从左侧移右侧实现全排列 package inte ...
- java中的递归算法_java中的递归算法
import java.math.BigDecimal; /** * 递归计算1+2+3+...+100 * * @author dell * */ public class Test { publi ...
- Java中的无限层级递归树前后端操作解决方案
引言: 抖音真是一个神奇的软件,前两天脑海中浮现了一首歌,知道歌曲的调调,今天打算写博客之前刷了一下抖音,抖音的推荐算法居然给我推送了这首歌,这首歌叫做<一开始说陪你到老的人现在他还好吗> ...
- Java中的堆栈安全递归
在本文中,摘自< Java中的函数式编程 >一书,我解释了如何使用递归,同时避免了StackOverflow异常的风险. Corecursion正在使用第一步的输出作为下一步的输入来构成计 ...
- Java中的迭代与递归
递归 提到迭代,不得不提一个数学表达式: n!=n*(n-1)*(n-2)*...*1 有很多方法来计算阶乘.有一定数学基础的人都知道n!=n*(n-1)!因此,代码的实现可以直接写成: 代码一 in ...
- java中fork函数_java中的forkjoin框架的使用
fork join框架是java 7中引入框架,这个框架的引入主要是为了提升并行计算的能力. fork join主要有两个步骤,第一就是fork,将一个大任务分成很多个小任务,第二就是join,将第一 ...
- java中properties类_Java中的Properties类详解
1.Properties类是什么? Properties(Java.util.Properties),该类主要用于读取Java的配置文件,不同的编程语言有自己所支持的配置文件,配置文件中很多变量是经常 ...
- java中collection方法_Java 8中的Collector toCollection()方法
toCollection()Java中的Collector类的方法返回一个Collector,该Collector以遇到的顺序将输入元素累积到一个新的Collection中. 语法如下static & ...
最新文章
- MUV LUV EXTRA 2019CCPC秦皇岛站J题 KMP
- 本地html app跨域,本地webapp是怎么解决跨域问题的?
- 别人给你网盘分享东西怎么搞到电脑上看呢?
- 知识梳理——CSS篇
- oracle检查外键依赖,Oracle中检查外键是否有索引的SQL脚本分享
- linux 命令速查手册之十
- 前端的深拷贝和浅拷贝_javascript中的深拷贝和浅拷贝?
- ASP.NET Core 中文文档 第二章 指南(4.10)检查自动生成的Detail方法和Delete方法
- Linux虚拟机下mysql 5.7安装配置方法图文教程
- 实例集群状态为Fail导致的集群混乱排查和复现
- WebCollector 简介与 快速入门
- bzero函数_Poll 函数
- CS224N 笔记一
- java emf 转jpg_java – emf到jpg的转换
- Android Studio 报错:Incompatible types
- 谷歌SEO入门的基础知识
- 立创eda学习笔记二十二:如何修改pcb网络颜色?
- 线性插值函数的基函数构造
- 到底该不该用RTOS,这篇文章给你答案!
- PHP代码从数据库中获取数据