递归(java)

news2024/9/21 10:36:11

1.递归应用场景

看个实际应用场景,迷宫问题(回溯), 递归(Recursion)

1678007343346

2.递归的概念

简单的说: 递归就是方法自己调用自己,每次调用时传入不同的变量.递归有助于编程者解决复杂的问题,同时可以让代码变得简洁。

3.递归调用机制

我列举两个小案例,来帮助大家理解递归,部分学员已经学习过递归了,这里在给大家回顾一下递归调用机制

1)打印问题

2)阶乘问题

1678007819020

4.代码演示

package com.yt;

/**
 * @auther yt
 * @address https://www.cnblogs.com/y-tao/
 */
public class RecursionTest {
    public static void main(String[] args) {
        //通过打印问题,回顾递归调用机制
//        test(4);
        int res = factorical(4);
        System.out.println(res);
    }

    //打印问题
    public static void test(int n){
        if (n>2){
            test(n-1);
        } //else {
            System.out.println("n=" + n);
        //}
    }
    //阶乘问题
    public static int factorical(int n){
        if (n==1){
            return 1;
        } else {
            return n * factorical(n-1);
        }
    }
}

5.递归能解决什么样的问题

1)各种数学问题如: 8皇后问题 , 汉诺塔, 阶乘问题, 迷宫问题, 球和篮子的问题(google编程大赛)

2)各种算法中也会使用到递归,比如快排,归并排序,二分查找,分治算法等.

3)将用栈解决的问题-->递归代码比较简洁

6.递归需要遵守的重要规则

1)执行一个方法时,就创建一个新的受保护的独立空间(栈空间)

2)方法的局部变量是独立的,不会相互影响

3)方法中使用的变量是引用类型,则各个栈就会共享该数据空间.

4)递归必须向退出递归的条件逼近,否则就是无限递归,死龟了:)

5)当一个方法执行完毕,或者遇到return,就会返回,遵守谁调用,就将结果返回给谁,同时当方法执行完毕或者返回时,该方法也就执行完毕。

7.递归实现迷宫问题

package com.yt;

/**
 * @auther yt
 * @address https://www.cnblogs.com/y-tao/
 */
public class MiGong {
    public static void main(String[] args) {
        //先创建一个二维数组,模拟迷宫
        //地图
        int[][] map = new int[8][7];
        //1 表示墙
        //上下全部设置为1
        for (int i = 0; i < 7; i++) {
            map[0][i] = 1;
            map[7][i] = 1;
        }

        //左右全部设置为1
        for (int i = 0; i < 8; i++) {
            map[i][0] = 1;
            map[i][6] = 1;
        }

        //设置挡板,1表示墙
        map[3][1] = 1;
        map[3][2] = 1;
        //输出地图
        System.out.println("地图的情况");
        for (int i = 0; i < 8; i++) {
            for (int j = 0; j < 7; j++) {
                System.out.print(map[i][j] + " ");
            }
            System.out.println();
        }

        setWay(map,1,1);

        //输出新的地图,小球走过,并标记过的递归
        System.out.println("小球走过,并标记过的地图的情况");
        for (int i = 0; i < 8; i++) {
            for (int j = 0; j < 7; j++) {
                System.out.print(map[i][j] + " ");
            }
            System.out.println();
        }

    }

    //使用递归回溯来给小球找路
    //说明
    //1.map表示地图
    //2. i,j表示从地图的哪个位置开始出发(1,1)
    //3.如果小球能到map[6][5]位置,则说明通路找到
    //4.约定:当map[i][j]=0 表示该点没有走过,当为1时表示墙,2表示通路可以走;3表示改点已经走过,但是走不通
    //5.在走迷宫时,需要确定一个策略(方法)下->右->上->左,在回溯

    /**
     *
     * @param map 表示地图
     * @param i 从哪个位置开始找
     * @param j
     * @return 如果找到通路,就返回true,否则返回false
     */
    public static boolean setWay(int[][] map, int i, int j){
        if (map[i][j]==2){
            //通路已经找到
            return true;
        } else {
            if (map[i][j]==0){//如果当前这个点还没有走过
                //按照策略 下 右 上 左 走
                map[i][j] = 2;//假定该点是可以走通的
                if (setWay(map,i+1,j)){//向下走
                    return true;
                } else if (setWay(map,i,j+1)){
                    //向右走
                    return true;
                } else if (setWay(map,i-1,j)){
                    //向上走
                    return true;
                } else if (setWay(map,i,j-1)){
                    //向左走
                    return true;
                } else {
                    //说明该点是走不通的,是死路
                    map[i][j] = 3;
                    return false;
                }

            } else {
                //说明map[i][j]!=0,可能是1,2,3
                return false;
            }

        }

    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/393339.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Stream——数字类型的字符串排序

文章目录前言什么是数字类型的字符串一个简单的坑demo拯救坑代码对象集合中的数字类型排序(有坑)对象集合中的数字类型排序 解决扩展将数字类型字符串数组转换为Integer集合总结前言 想到给数据进行排序&#xff0c;一开始头脑中想到的就是sorted()&#xff0c;本篇文章重点说…

SSL安全证书有什么优缺点?

在将SSL实施到您的站点之前&#xff0c;了解SSL的优点和缺点非常重要。下面就给大家分析下安装SSL证书有什么优缺点&#xff1a;优点&#xff1a;1. 加密信息确保您在线发送的数据只被指定的接收者读取&#xff0c;而不被其他人读取。SSL对原始数据进行了一些更改&#xff0c;因…

秒懂SpringBoot之Filter与HandlerInterceptor异同

[版权申明] 非商业目的注明出处可自由转载 出自&#xff1a;shusheng007 文章目录概述前置知识Filter原理及使用场景使用执行顺序设置Filter作用范围HandlerInterceptor原理及使用场景使用实现org.springframework.web.servlet.HandlerInterceptor 接口配置二者异同共同点不同点…

RocketMQ 高级特性

1&#xff0c;事务消息代码实现 之前我们已经在讨论订单业务消息丢失问题中引出了事务消息&#xff0c;本内容我们就实际用代码来实现一下事务消息吧。 首先我们用原生代码来实现一下事务消息&#xff0c;下面是事务消息生产者TransactionProducer类的代码&#xff0c;具体代码…

基于LinkedList高性能android列表适配器

1、前言 我们大部分的时候都是使用ArrayList作为Android适配器Adapter&#xff08;无论是ListView或者RecyclerView&#xff09;下的数据容器。为什么使用ArrayList呢&#xff1f;因为他的内部是由数组实现的&#xff0c;所以访问数组元素速度最快&#xff0c;但是如果数据变化…

JNI内两种方式从C/C++中传递一维、二维、三维数组数据至Java层详细梳理

目录 0 前言 1 准备工作介绍 2 一维数组 2.1 return形式 2.2 参数形式 3 二维数组 3.1 return形式 3.2 参数形式 4 三维数组 4.1 return形式 4.2 参数形式 5 测试代码 6 结果说明 0 前言 就如之前我写过的一篇文章【JNI内形参从C代码中获取返回值并返回到Java层使…

Elsevier上传LaTeX 修改稿踩坑

背景 千辛万苦修改完论文&#xff0c;结果发现要求上传可编辑文件&#xff0c;tex上传真的太难了&#xff0c;一堆坑&#xff0c;尤其是编译错误&#xff0c;要等系统创建pdf后才能找到。中间还打了北京的客服电话&#xff0c;结果他们那边并不懂相关的东西。说latex是第三方公…

C语言-基础了解-22-C文件读写

C文件读写 一、打开文件 可以使用 fopen( ) 函数来创建一个新的文件或者打开一个已有的文件&#xff0c;这个调用会初始化类型 FILE 的一个对象&#xff0c;类型 FILE 包含了所有用来控制流的必要的信息。下面是这个函数调用的原型&#xff1a; FILE *fopen( const char *fil…

JS中undefined和null的区别

● JavaScript 真是一个特殊的语言, 其他语言都只有一个表示 “无” 的值, 比如 Java 语言用的是 null, C 语言用的是 NULL, Python 语言用的是 None, Ruby 语言用的是 nil. 只有 JS 里面表示 “空” 的有两个, 一个是 undefined, 一个是 null ● 很多小朋友在刚开始学习的时候…

【项目设计】高并发内存池(六)[细节优化+测试]

&#x1f387;C学习历程&#xff1a;入门 博客主页&#xff1a;一起去看日落吗持续分享博主的C学习历程博主的能力有限&#xff0c;出现错误希望大家不吝赐教分享给大家一句我很喜欢的话&#xff1a; 也许你现在做的事情&#xff0c;暂时看不到成果&#xff0c;但不要忘记&…

[ 网络 ] 应用层协议 —— HTTP协议

目录 1.HTTP协议 1.1URL urlencode和urldecode 2. HTTP协议格式 HTTP请求 HTTP响应 3.告知服务器意图的HTTP方法 GET&#xff1a;获取资源 POST&#xff1a;传输实体主体 GET和POST的区别 使用Cookie的状态管理 4.返回结果的HTTP状态码 状态码告知从服务器端返回的…

十连胜!实在智能×浙江省十家农商行,数字科技赋能普惠金融

近日&#xff0c;中共中央、国务院印发了《数字中国建设整体布局规划》&#xff08;以下简称《规划》&#xff09;。《规划》指出&#xff0c;建设数字中国是数字时代推进中国式现代化的重要引擎&#xff0c;是构筑国家竞争新优势的有力支撑。全面提升数字中国建设的整体性、系…

C语言-基础了解-23-C预处理器

C预处理器 一、C预处理器 C 预处理器不是编译器的组成部分&#xff0c;但是它是编译过程中一个单独的步骤。简言之&#xff0c;C 预处理器只不过是一个文本替换工具而已&#xff0c;它们会指示编译器在实际编译之前完成所需的预处理。我们将把 C 预处理器&#xff08;C Prepr…

spring-security2

参考b站up主&#xff1a;传送门 前沿 &#xff1a; 回顾上章&#xff1a;最顶层就是一个过滤器 SpringSecurity流程&#xff1a;FilterChainProxy->根据请求决定一个 SecurityFilterChain (挨个调用其matches方法 匹配请求能否处理)-> 执行SecurityFilterChain中的一系列…

Java简单认识泛型——图文详解

写在开头:想必大家和博主一样&#xff0c;在以往学习JavaSE的语法中&#xff0c;遇到了一个陌生的词——泛型&#xff0c;博主当时很好奇&#xff0c;什么是泛型呢&#xff1f;即使是学完了JavaSE&#xff0c;这个问题都没有解决&#xff0c;只能在百度查阅了解关于泛型的一些皮…

Maven依赖的基本概念

目录 1.依赖的基本配置 2.依赖范围 3.传递性依赖 1.依赖的基本配置 根元素project下的dependencies可以包含多个 dependence元素&#xff0c;以声明多个依赖。每个依赖都应该包含以下元素&#xff1a; 1. groupId, artifactId, version : 依赖的基本坐标&#xff0c; 对于任…

【C和C++】输出100内能够被13整除的数,取模判断方法

目录 前言基础概念重温整除例子小知识点收尾前言 在软件行业已经有快十年,技术虽然一般般,但是足够应付和解决编程入门的相关问题! 都说十年磨一剑,积累到一定经验,是时候发挥自己的价值,给予入门的同行些许的帮助! 为什么要写收费专栏,其实原因很简单,时间就是金钱(…

聚观早报 |拼多多跨境电商业务正式登陆澳洲;中国加快6G网络研发

今日要闻&#xff1a;拼多多跨境电商业务正式登陆澳洲&#xff1b;全球自动驾驶公司排名特斯拉垫底&#xff1b;中国将加快 6G 网络研发&#xff1b;B站再次“崩”上热搜&#xff01;已闪电修复&#xff1b;微软将必应AI聊天每次对话上限增加至8条拼多多跨境电商业务正式登陆澳…

大神教你在 Linux 中查看你的时区

在这篇短文中&#xff0c;我们将向你简单介绍几种 Linux 下查看系统时区的简单方法。在 Linux 机器中&#xff0c;尤其是生产服务器上的时间管理技能&#xff0c;是在系统管理中一个极其重要的方面。Linux 包含多种可用的时间管理工具&#xff0c;比如 date 或 timedatectlcomm…

自动化测试——执行javaScript脚本

文章目录一、点击元素(对应的click())二、input标签对应的值&#xff08;对应的send_keys()&#xff09;修改时间控件的属性值&#xff1a;三、元素的文本属性四、js脚本滚动操作一、点击元素(对应的click()) 使用场景&#xff1a;当使用显性等待不能解决问题时 代码中实现点击…