返回顶部
首页 > 资讯 > 后端开发 > PHP编程 >Java递归寻路实现,你真的理解了吗
  • 632
分享到

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

Java递归java实现 2017-05-23 03:05:49 632人浏览 猪猪侠
摘要

目录引使用递归计算阶乘地图创建核心完整代码总结引 看懂这张图,方法调用方法,栈开新栈,递归尾结束要回到main栈,必须一级一级返回,每一次返回都是调用整个方法,调用完成栈被释放,直至回到栈底main递归结束并能够自己画出来,理解递归的运行

目录
  • 使用递归计算阶乘
  • 地图创建
  • 核心
  • 完整代码
  • 总结

在这里插入图片描述

看懂这张图,方法调用方法,栈开新栈,递归尾结束要回到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]的位置,思考:使用递归如何让小老鼠寻路逃生呢?

在这里插入图片描述

思考过后,脑袋是不是蒙蒙的

想要玩起来

地图创建

思路

先创建迷宫,用二维数组表示 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) {
        //思路
        //1.先创建迷宫,用二维数组表示 int[][] map = new int[8][7];
        //2.规定 map:0 表示可以走,1表示墙不能走
        int[][] map = new int[8][7];
        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;
        //打印
        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();
        }
        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();
        }
    }
}
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;
           }
       }
    }
}

总结

本篇文章就到这里了,希望能给你带来帮助,也希望您能够多多关注编程界的更多内容!

--结束END--

本文标题: Java递归寻路实现,你真的理解了吗

本文链接: https://lsjlt.com/news/66.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • Java递归寻路实现,你真的理解了吗
    目录引使用递归计算阶乘地图创建核心完整代码总结引 看懂这张图,方法调用方法,栈开新栈,递归尾结束要回到main栈,必须一级一级返回,每一次返回都是调用整个方法,调用完成栈被释放,直至回到栈底main递归结束并能够自己画出来,理解递归的运行...
    99+
    2017-05-23
    Java递归 java实现
  • Java的代理模式你真的了解吗
    目录代理模式原理解析动态代理的原理解析代理模式的应用场景代理模式原理解析 代理模式(Proxy Design Pattern),它在不改变原始类(或者叫被代理类)代码的情况下,通过引...
    99+
    2024-04-02
  • 关于Java Object你真的了解了吗
    导读: 在平时的coding中hashCode()和equals()的使用的场景有哪些?clone深复制怎么实现?wait()和notify()有什么作用?finalize()方法干嘛的?看似coding中使用的不多,不重要,但是有没有跟我...
    99+
    2023-05-31
    java object ava
  • java的泛型你真的了解吗
    目录泛型的概述和优势自定义泛型类自定义泛型方法自定义泛型接口泛型通配符、上下限总结泛型的概述和优势 泛型概述 泛型:是JDK5中引入的特性,可以在编译阶段约束操作的数据类型,并进行检...
    99+
    2024-04-02
  • Java 缓存:你真的了解它吗?
    在 Java 开发中,缓存是一个非常重要的概念。它可以大大提升应用程序的性能,减少对底层资源的占用,提高用户体验。但是,你真的了解 Java 缓存吗?本文将为大家介绍 Java 缓存的基本概念、分类、应用场景以及常见的缓存框架。 一、缓存...
    99+
    2023-10-06
    缓存 学习笔记 面试
  • 深入了解JavaScript中递归的理解与实现
    目录前言递归的基本理解实例解析求斐波那契数时间复杂度分析空间复杂度分析执行顺序分析前言 我们在写业务代码的时候,或多或少都会遇到需要使用递归的场景,比如在遍历树形结构时。 本文将通过...
    99+
    2024-04-02
  • 你真的理解Java中的ArrayList吗
    目录1. 为什么需要ArrayList?2. ArrayList底层是如何实现的?3. 结合源码分析主要成员变量4. 个人的一点总结1. 为什么需要ArrayList? 图1...
    99+
    2024-04-02
  • 你真的了解Java实时重定向索引吗?
    Java实时重定向索引是一种高效的数据结构,其可以让我们在不停止应用程序的情况下,快速地更新和查询数据。然而,很多开发者并不了解这个特性,下面我们就来深入了解一下Java实时重定向索引。 什么是Java实时重定向索引? Java实时重定...
    99+
    2023-09-21
    实时 重定向 索引
  • Java和JavaScript的异同,你真的了解吗?
    Java和JavaScript是两种非常常见的编程语言,它们在很多方面有着相似的特性,但它们也有着很多不同之处。在本文中,我们将探讨Java和JavaScript的异同,并且演示一些代码示例来帮助你更好地理解它们。 Java和JavaS...
    99+
    2023-10-24
    javascript http 重定向
  • C++中的函数你真的理解了吗
    目录1 概述2 函数的定义及调用3 值传递4 函数的常见形式5 函数的声明6 函数的分文件编写作用:让代码结构更加清晰1.2.3.4.总结1 概述 作用:将一段经常使用的代码进行封装...
    99+
    2024-04-02
  • C++中的数组你真的理解了吗
    目录1 概述2 一维数组2.1 一维数组定义方式2.2 一维数组组名2.3 冒泡排序3 二维数组3.1 二维数组定义方式3.2 二维数组数组名3.3二维数组应用举例总结1 概述 所谓...
    99+
    2024-04-02
  • 你真的了解Java的多线程方法吗
    目录Java 多线程方法详解startrunyieldjoinsleepInterruptdeamonPriority总结Java 多线程方法详解 start start方法&nbs...
    99+
    2024-04-02
  • ASP 框架教程:你真的理解了吗?
    ASP框架教程:你真的理解了吗? ASP框架是一个非常流行的Web应用程序开发框架,使用了Microsoft ASP.NET技术。这个框架的目的是为了让开发人员更快速、更容易地创建Web应用程序。但是,ASP框架的概念并不容易理解,因此在这...
    99+
    2023-08-05
    框架 教程 学习笔记
  • Java同步框架API:你真的了解它吗?
    Java是一个非常流行的编程语言,它的强大之处在于它提供了许多非常有用的API,其中包括同步框架API。同步是指多个线程在共享相同资源时需要互相协调和同步,以避免出现竞争条件和数据不一致等问题。在Java中,同步框架API提供了一些有用的...
    99+
    2023-09-05
    同步 框架 api
  • Vue的diff算法原理你真的了解吗
    目录思维导图0. 从常见问题引入1. 生成虚拟dom1. h方法实现2. render方法实现3. 再次渲染2. diff算法1. 对常见的dom做优化情况1:末尾追加一个元素(头和...
    99+
    2024-04-02
  • 你真的了解Java中NumPy的索引机制吗?
    Java中的NumPy是一种非常强大的数组处理工具,它可以帮助我们高效地处理大量的数据。在Java中,NumPy的索引机制是非常重要的一个概念,它可以帮助我们快速地定位和获取数组中的数据。本文将深入探讨Java中NumPy的索引机制,帮助读...
    99+
    2023-05-26
    numy numpy 索引
  • 你真的了解 Java 分布式编程算法吗?
    Java分布式编程算法是一种处理分布式计算的技术,它可以通过不同的节点分布计算任务,将计算结果整合在一起。在本文中,我们将深入了解Java分布式编程算法,并提供一些示例代码来帮助您更好地理解。 Java分布式编程算法的基础概念 Java分布...
    99+
    2023-06-20
    教程 分布式 编程算法
  • Java 动态代理你真的懂了吗(动态和代理)
    好几天不写文章,今天来写一篇,从之前的计划表上看到还有关于java的动态代理没写,这个技术平常用的少,也不是特别好理解,今天补上这篇,希望能讲明白,不至于像我一样迷茫好久,开始吧 动...
    99+
    2024-04-02
  • C++的动态内存管理你真的了解吗
    目录前言用法上对内置类型对自定义类型new/delete底层原理重载类的专属operator new和 operator delete定位newnew/delete与malloc/f...
    99+
    2024-04-02
  • Go编程中的数组:你真的理解了吗?
    数组是编程语言中最基础的数据结构之一,Go语言中也不例外。它是一种固定长度、存储相同类型元素的数据结构。虽然在Go中也有切片(slice)这样的动态数组类型,但是对于一些固定长度的数据存储需求,数组仍然是很有用的。 本文将深入探讨Go编程...
    99+
    2023-08-15
    编程算法 关键字 数组
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作