Java递归寻路实现,你理解递归了吗

看懂这张图,方法调用方法,栈开新栈,递归尾结束要回到main栈,必须一级一级返回,每一次返回都是调用整个方法,调用完成栈被释放,直至回到栈底main递归结束并能够自己画出来,理解递归的运行机制,这是我手画的,不好看,你的呢,还不动起来😏

在这里插入图片描述

🆗,到这,如果上面的你都理解了,那么我相信你可以用递归写出 计算 n 的阶乘的程序了,什么,写不出,没有关系,我来补上,一定要理解在栈里运行机制

使用递归计算阶乘


public class Factorial {

public static void main(String[] args) {

Factorial jie = new Factorial ();

System.out.println(jie.f(3));

}

public int f(int n){

if(n == 1){

return 1;

}else {

return n*f(n-1);

}

}

}


接下来就可以玩起来了,一个有趣的迷宫问题,假设有如下二维数组表示地图,数字1表示围墙,数字0表示可以走,现在有只小老鼠被困在下标为[1][1]的位置,出口在下标为[6][5]的位置,思考:使用递归如何让小老鼠寻路逃生呢?

在这里插入图片描述

思考过后,脑袋是不是蒙蒙的,不是?那请你喝瓶雪花❄😂

在这里插入图片描述

想要玩起来

地图创建


思路

  1. 先创建迷宫,用二维数组表示 int[][] map = new int[8][7];

  2. 规定 map:0 表示可以走,1表示墙不能走

1,打印二维数组

public class miGong {

public static void main(String[] args) {

int[][] map = new int[8][7];

for (int i = 0; i < map.length; i++) {

for (int j = 0; j < map[i].length; j++) {

System.out.print(map[i][j]+" ");

}

System.out.println();

}

}

}

在这里插入图片描述

2,规定墙和可以走的,只需要通过遍历指定行和列,再把两个特别的单独强调,完成

for (int i = 0;i < 7;i++){

map[0][i] = 1;

map[7][i] = 1;

}

for (int i = 0;i < 8;i++){

map[i][0] = 1;

map[i][6] = 1;

}

map[3][1] = 1;

map[3][2] = 1;

实现效果

在这里插入图片描述


核心


这时就完成了地图,思考如何使用递归寻路呢

开始吧,写一个方法,通过递归来实现寻路,我直接放代码了

  • 首先,创建一个类,写findWay方法,返回值是boolean,三个参数,分别是地图,二维坐标x,y用来确定位置

  • 接着,我们判断如果map[6][5] == 2,就认为小老鼠找到出口了,这点很重要,它是递归回调条件

  • 如果map[6][5] == 2条件为假,说明小老鼠没有找到出口,调用方法时初始化开始坐标,接着map[i][j] = 2;假设可以走通就把坐标的值修改为2,表示老鼠走的痕迹

  • 接下来,奇妙的事情发生了,递归就在这里开始了,我们调用自己findWay传入参数,我们先确定下来小老鼠的行走轨迹,假设是下-右-上-左,我们通过修改数组下标来表示小老鼠的移动,假设上下左右都没能走通,就把坐标值修改为3,表示小老鼠被困死了,返回false,失败,🆗,代码已经完成

  • 小伙伴:什么???完成了???


在这里插入图片描述


class way{

//使用递归回溯的思想来解决

public boolean findWay(int[][] map,int i,int j){

if(map[6][5] == 2){

return true;

}else{

if(map[i][j] == 0){

//假定可以走通

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 {

map[i][j] = 3;

return false;

}

}else {

return false;

}

}

}

}

主函数调用,查看结果:

way f = new way();

f.findWay(map,1,1);

System.out.println(“=找路=”);

for (int i = 0; i < map.length; i++) {

for (int j = 0; j < map[i].length; j++) {

System.out.print(map[i][j]+" ");

}

System.out.println();

}

运行代码查看结果:

在这里插入图片描述

在这里插入图片描述

看到成功寻路逃生~~~,是不是还很疑惑

在这里插入图片描述

一定要理解透,你也可以设置死路,只要上面的理解了,达到能在脑子里快速回放递归的过程,栈开栈,栈销毁,等等,你就可以随便玩了,之前是不是一直不理解为什么说递归占用空间,谨慎使用,这下就明明白白了,好了,多理解理解,这就是所有内容,感受到递归的魅力了吗?哈哈 是不是很好玩,体会这种思想,感谢观看

完整代码


public class miGong {

public static void main(String[] args) {

//思路

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

如果你觉得这些内容对你有帮助,可以扫码获取!!(备注Java获取)

img

总结

在清楚了各个大厂的面试重点之后,就能很好的提高你刷题以及面试准备的效率,接下来小编也为大家准备了最新的互联网大厂资料。

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!

总结

在清楚了各个大厂的面试重点之后,就能很好的提高你刷题以及面试准备的效率,接下来小编也为大家准备了最新的互联网大厂资料。

[外链图片转存中…(img-f27nTj4S-1713177060638)]

[外链图片转存中…(img-A2BOTz5O-1713177060638)]

[外链图片转存中…(img-V9XfUBrd-1713177060638)]

[外链图片转存中…(img-oVAygZlm-1713177060638)]

《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!

  • 27
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值