本文主要讲述java中的递归机制。

示例1,递归代码如下:

public class Recursion01 {
public static void main(String[] args) {
T t = new T();
t.test(4);
} }
class T {
public void test(int n) {
if(n > 2) {
test(n-1);
}
System.out.println(n);
}
}

jvm处理递归机制如下图所示:

运行结果如下:

示例2,递归代码如下:

public class Recursion01 {
public static void main(String[] args) {
T t = new T();
t.test(4);
}
}
class T {
public void test(int n) {
if(n > 2) {
test(n-1);
}else {
System.out.println(n);
}
}
}

jvm处理递归机制如下图所示:

运行结果是2。

注意示例1和示例2的区别。示例1是执行test方法,就会打印当前的n,示例2是做出判断小于或者等于2的打印当前的n。

课堂练习:

1.斐波那契数列

public class Recursion02 {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int key = scanner.nextInt();
// int num = new NumUtils().fun(key);
// if(num >= 1) {
// System.out.println("当n="+key+"时,对应的斐波那契数列:"+num);
// }else {
// System.out.println("输入数据无效");
// }
new NumUtils().Fibonacci(key);
} } class NumUtils {
// 斐波那契数列中指定索引的值
public int fun(int n) {
if(n > 2) {
return fun(n-1)+fun(n-2);
}
if(n == 1 || n == 2){
return 1;
}
return -1; } // 打印斐波那契数列
public void Fibonacci(int n) {
int a = 0,b = 1,c;
if(n > 1) {
System.out.print(1+" ");
for(int i =1;i<n;i++) {
c = a + b;
a = b;
b = c;
System.out.print(c +" ");
}
}else {
System.out.println("输入数据有误");
}
}
}

运行结果:

2.猴子吃桃问题:

/* 吃桃规则:每次吃剩余桃子的一半,加一。
* day10,还有1个桃
* day9,还有4 = (day10 + 1)*2个桃
* day8,还有10 = (day9 + 1)*2个桃
* ...
*/ public class Recursion03 {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int day = scanner.nextInt();
int res = new Monkey().Peach(day);
if(res != -1) {
System.out.println("当day="+day+"时,还有"+res+"个桃");
}else {
System.out.println("输入天数有误");
} }
}
class Monkey{ public int Peach(int day) { if(day == 10) {
return 1;
}
if(day >= 1 && day <10) {
return (Peach(day + 1)+1)*2;
} return -1;
}
}

3.迷宫问题

public class Migong {
public static void main(String[] args) { int [][] map = new int[8][7]; MiGongGraph graph = new MiGongGraph();
graph.CreateGraph(map);
graph.findWay2(map, 1, 1); System.out.println("===当前地图===");
for(int i =0;i<map.length;i++) {
for(int j = 0;j<map[0].length;j++) {
System.out.print(map[i][j]+" ");
}
System.out.println();
} } } class MiGongGraph {
public void CreateGraph(int[][] map) {
for(int j = 0;j < map[0].length;j++) {
map[0][j] = 1;
map[map.length-1][j] = 1;
} for(int i = 0;i<map.length;i++) {
map[i][0] = 1;
map[i][map[0].length-1] = 1;
}
map[3][1] = 1;
map[3][2] = 1;
map[2][2] = 1;
} /*
* 0表示还没有走,不是障碍物,
* 1表示障碍物,
* 2表示走过,无法确定是否是死路
* 3表示走过,但是走不通,是死路。
*
* 走路的顺序,右->下->上->左
*/
public boolean findWay(int [][] map,int i,int j) {
// map[5][6] = 2时,说明已经走出迷宫。
if(map[6][5] == 2) {
return true;
}else {
// 递归体:
// 判断当前坐标是否已经走过
if(map[i][j] == 0) {
// 没有走过,则将其对应的二维数组的值置为2
map[i][j] = 2; // 沿着这个点,按照顺序,走路。
// 首先是这个点的右边
if(findWay(map, i, j+1)) {
return true;
// 接着是这个点的下边
}else if(findWay(map, i+1, j)) {
return true;
// 接着是这个点的上边
}else if(findWay(map, i-1, j)) {
return true;
// 最后是这个点的左边
}else if(findWay(map, i, j-1)) {
return true;
}else {
// 由于该点的右->下->上->左,都不能走通,则该点是死路,置为3。
map[i][j] = 3;
return false;
}
// 已经走过,不回溯。
}else {
return false;
}
}
} public boolean findWay2(int [][] map,int i,int j) {
if(map[6][5] == 2) {
return true;
}else {
// 递归体:
// 判断当前坐标是否已经走过
if(map[i][j] == 0) {
// 没有走过,则将其对应的二维数组的值置为2
map[i][j] = 2; // 沿着这个点,按照顺序,走路。
// 首先是这个点的下边
if(findWay(map, i+1, j)) {
return true;
// 接着是这个点的右边
}else if(findWay(map, i, j+1)) {
return true;
// 接着是这个点的上边
}else if(findWay(map, i-1, j)) {
return true;
// 最后是这个点的左边
}else if(findWay(map, i, j-1)) {
return true;
}else {
// 由于该点的右->下->上->左,都不能走通,则该点是死路,置为3。
map[i][j] = 3;
return false;
}
// 已经走过,不回溯。
}else {
return false;
}
}
}
}

4.汉诺塔问题:

汉诺塔规则:a,b,c三柱,将从上往下看由小到大的塔,由a柱搬到c柱。塔仍保持从上往下看,由小到大。

public class HanNoTa {
public static void main(String[] args) {
Tower tower = new Tower();
tower.Method(3, 'A', 'B', 'C');
} } class Tower { // num是盘子的总数,a,b,c是指代三根柱子。
public void Method(int num,char a,char b,char c) {
if(num == 1) {
System.out.println(a +"->"+c);
}else {
// 将汉诺塔分成最后一个盘和上面的盘,两个部分
// 先将上面的盘,借助c柱,由a柱搬到b柱
Method(num-1, a, c, b);
// 此时只剩下最后一个盘,直接由a柱搬到c柱
System.out.println(a+"->"+c);
// 还需要将上面的盘,由b柱移动到c柱
// System.out.println(b+"->"+c);
// 将上面的盘子,借助a柱,由b柱搬到c柱。
// 不能直接由b柱到c柱,违背汉诺塔的规则。
Method(num-1, b, a, c); }
}
}

java中的递归机制的更多相关文章

  1. Java中的递归运算

    Java中的递归运算是一种在自己的方法内部调用自己的方法 递归的设计思想是:把一个复杂的问题,分解为若干个等同的子问题,重复执行,直到之问题能够简单到直接求解,这样复杂的问题就得以解决. 递归运算有两 ...

  2. java中的反射机制在Android开发中的用处

    JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意一个方法和属性:这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反 ...

  3. java中wait/notify机制

    通常,多线程之间需要协调工作.例如,浏览器的一个显示图片的线程displayThread想要执行显示图片的任务,必须等待下载线程 downloadThread将该图片下载完毕.如果图片还没有下载完,d ...

  4. 浅说Java中的反射机制(二)

    写过一篇Java中的反射机制,不算是写,应该是抄了,因为那是别人写的,这一篇也是别人写的,摘抄如下: 引自于Java基础--反射机制的知识点梳理,作者醉眼识朦胧.(()为我手记) 什么是反射? 正常编 ...

  5. 浅说Java中的反射机制(一)

    在学习传智播客李勇老师的JDBC系列时,会出现反射的概念,由于又是第一次见,不免感到陌生.所以再次在博客园找到一篇文章,先记录如下: 引用自java中的反射机制,作者bingoideas.(()为我手 ...

  6. 【笔试题】Java 中如何递归显示一个目录下面的所有目录和文件?

    笔试题 Java 中如何递归显示一个目录下面的所有目录和文件? import java.io.File; public class Test { private static void showDir ...

  7. 【Java】深入理解Java中的spi机制

    深入理解Java中的spi机制 SPI全名为Service Provider Interface是JDK内置的一种服务提供发现机制,是Java提供的一套用来被第三方实现或者扩展的API,它可以用来启用 ...

  8. 2018.3.31 java中的递归

    java中的递归 1.概念 定义一个方法时,出现本方法调用本方法的过程,称之为递归 2.特点 必然有一个边界条件 使用递归代码往往更简洁,可读性强 3.什么时候使用递归 n的阶乘和n的累加定义 f(n ...

  9. 【Java基础】java中的反射机制与动态代理

    一.java中的反射机制 java反射的官方定义:在运行状态下,可以获取任意一个类的所有属性和方法,并且可通过某类任意一对象实例调用该类的所有方法.这种动态获取类的信息及动态调用类中方法的功能称为ja ...

随机推荐

  1. vscode展示子文件夹

    取消勾选设置-功能-compact Folders

  2. 密码学奇妙之旅、01 CFB密文反馈模式、AES标准、Golang代码

    CFB密文反馈模式 CFB密文反馈模式属于分组密码模式中的一种.加密与解密使用同一结构,加密步骤生成用于异或的密钥流. 其弥补了ECB电子密码本模式的不足(明文中的重复排列会反映在密文中,通过删除替换 ...

  3. localStorage概要

    在HTML5中,新加入了一个localStorage特性,这个特性主要是用来作为本地存储来使用的,解决了cookie存储空间不足的问题(cookie中每条cookie的存储空间为4k),localSt ...

  4. Dapr 长程测试和混沌测试

    介绍 这是Dapr的特色项目,具体参见: https://github.com/dapr/test-infra/issues/11 ,在全天候运行的应用程序中保持Dapr可靠性至关重要.在部署真正的应 ...

  5. Vue+vant移动端处理弹窗不能滑动问题

    自己在做项目开发时,使用vantUI组件,在项目中遇到了弹窗组件里面当内容过多时,会出现滚动卡顿或者不能滚动问题,开始一直以为是自己的样式写的有问题,检查下来才发现并不是,而是弹窗组件的问题,于是找到 ...

  6. <一>关于进程虚拟地址空间区域内存划分和布局

    C++代码在编译完成后会生产.exe程序(windows平台), .EXE以文件的形式存储在磁盘上,当运行.exe程序的时候 操作系统会将磁盘上的.exe文件加载到内存中,那么在加载到内存中的时候,操 ...

  7. 2022.3.12 提高A组总结&反思

    今天有点上头了 T1:开场秒,大水题,一眼莫队了,最后没打 T2:开场以为是费用流,后来发现费用流做不了,在做T3的时候突然发现可以状压,也没打 T3:这道题给我极大的亲切感,导致我一个上午硬钢这道题 ...

  8. 以开发之名 | bilibili会员购让IP在眼前动起来

    随着ACG文化(二次元文化)影响力的不断提升,哔哩哔哩平台上衍生品消费群体不断扩大,手办行业迅速崛起.2017年,B站推出ACG衍生品消费品牌bilibili会员购,涵盖二次元手办销售等多项业务,拓展 ...

  9. 将java装进u盘指南

    将java装入u盘指南 idea 将下载好的idea的文件夹移动到u盘中.在idea的bin目录里找到idea.properties文件,在最后添加以下两行 idea.config.path=U:/I ...

  10. Swagger的介绍

    一.Swagger是什么? Swagger 是一个规范和完整的框架,用于生成.描述.调用和可视化 RESTful 风格的 Web 服务. 二.Swagger 的优势? 支持 API 自动生成同步的在线 ...