java第十七课 —— 递归

方法递归调用

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

递归重要规则

  1. 执行一个方法时,就创建一个新的受保护的独立空间(栈空间)。
  2. 方法的局部变量是独立的,不会相互影响。
  3. 如果方法中使用的是引用类型变量(比如数组),就会共享该引用类型的数据。
  4. 递归必须向退出递归的条件逼近,否则就是无限递归,出现 StackOverflowError。
  5. 当一个方法执行完毕,或者遇到 return,就会返回,遵守谁调用就将结果返回给谁,同时当方法执行完毕或者返回时,该方法也就执行完毕。

练习题

  1. 请使用递归的方式求出斐波那契 1,1,2,3,5,8,13… 给你一个整数n,求出它的值是多少。

    import java.util.Scanner;
    public class RecursionExercise{public static void main(String[] args){Scanner myScanner = new Scanner(System.in);System.out.println("请输入一个整数:");int n = myScanner.nextInt();if(n < 1){System.out.println("要求输入是大于1的整数!!!");}else{ReExercise obj = new ReExercise();System.out.println("斐波那契的结果为:" + obj.Fib(n));}}
    }
    class ReExercise{public int Fib(int n){if (n == 1 || n == 2){return 1;}else{return Fib(n - 1) + Fib(n - 2);}} 
    }
    
  2. 猴子吃桃子问题:有一堆桃子,猴子第一天吃了其中的一半,然后再多吃了一个!以后
    每天猴子都吃其中的一半,然后再多吃一个。当到第10天时,想再吃时(即还没吃)发现只有1个桃子了。问题:最初共多少个桃子?

    import java.util.Scanner;
    public class RecursionExercise{public static void main(String[] args){ReExercise obj = new ReExercise();System.out.println("吃到第10天时,最初共有:" + obj.Func(10) + "个桃子。");}
    }
    class ReExercise{public int Func(int day){if (day == 1){return 1;}else{return (Func(day - 1) + 1) * 2;}} 
    }
    // 1
    // (1+1)  *2 = 4
    // (4+1)  *2 = 10
    // (10+1) *2 = 22
    
  3. 迷宫问题: 小球在左上角出发,到右下角则走出迷宫,其中红色部分均是墙。
    在这里插入图片描述

    import java.util.Scanner;
    public class MiGong{public static void main(String[] args){ReExercise obj = new ReExercise();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;//让老鼠找路obj.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.print("\n");}}
    }//FindWay是找出迷宫路径,找到返回true,否则false
    //i,j是老鼠的位置
    //找路策略:下右上左
    //Map[i][j] = 0表示未走过,1表示障碍物,2表示可以走的位置,3表示已经走过此路不通
    //当Map[6][5] = 2就说明找到通路啦。
    class ReExercise{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{//Map[i][j] = 1,2,3都是不能走的位置。return false;}}} 
    }
    
  4. 汉诺塔

    import java.util.Scanner;
    public class HanoiTower{public static void main(String[] args){Tower tower = new Tower();tower.move(5, 'A', 'B', 'C');}}
    class Tower{public void move(int num, char a, char b, char c){ //num 表示要移动的个数,a,b,c分别表示A塔,B塔,C塔if(num == 1){System.out.println(a + " --> " + c);}else{ //如果有多个盘,可以看成两个 ,最下面的和上面的所有盘(num-1)//(1)先移动上面所有的盘到 b,借助cmove(num - 1, a, c, b); //先移动上面所有的盘到 b,借助cSystem.out.println(a + " --> " + c); //把最下面的这个盘,移动到cmove(num - 1, b, a, c); //再把 b塔的所有盘,移动到c,借助a}}
    }
    
  5. 八皇后

    public class EightQueens {//定义max表示有多少个皇后int max = 8;int num = 0;//解法个数//定义数组array,保存皇后放置位置的结果,比如 arr = {0,4,7,5,2,6,1,3}int [] array = new int[max];public static void main(String[] args) {//测试8皇后EightQueens queen8 = new EightQueens();queen8.check(0);//从第一个皇后开始放System.out.println("一共有"+queen8.num+"解法");}/*** 编写一个方法,放置第n个皇后*  check的每一次递归时都有一个for循环,因此会有回溯* @param n*/private void check(int n){if (n == max){//n=8 相当于该放第九个皇后了(其实一共就八个皇后),有结果了,输出print();return;}//依次放入皇后,并判断是否冲突for (int i=0;i<max;i++){//先把当前皇后n,放到该行的第一列array[n]=i;//判断当放置第n个皇后到i列时是否冲突if (judge(n)){//不冲突,接着放N+1,即开始递归check(n+1);}//如果冲突就继续执行array[n]=i,在此之前i已经++了;//即将第n个皇后在本行后移一位}}/***当我们放置第n个皇后,就去检测该皇后是否和前面已经摆放的皇后冲突* @param n 表示第n个皇后* @return*/private boolean judge(int n){for (int i = 0; i < n; i++) {//判断第n个皇后是否和前面n-1个皇后在同一列 || 是否同一斜线if (array[i]==array[n]||Math.abs(n-i)==Math.abs(array[n]-array[i])){return false;}}return true;}//写一个方法,可以将皇后摆放的位置输出private void print (){num++;for (int i = 0; i < array.length; i++) {System.out.print(array[i]+ " ");}System.out.println();}
    }

    八皇后参考文章

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

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

相关文章

922. 按奇偶排序数组 II - 力扣

1. 题目 给定一个非负整数数组 nums&#xff0c; nums 中一半整数是 奇数 &#xff0c;一半整数是 偶数 。 对数组进行排序&#xff0c;以便当 nums[i] 为奇数时&#xff0c;i 也是 奇数 &#xff1b;当 nums[i] 为偶数时&#xff0c; i 也是 偶数 。 你可以返回 任何满足上述…

微服务架构-异步消息传递设计模式

微服务架构-异步消息传递设计模式 异步消息允许服务发送消息后立即返回&#xff0c;而不需要等待消息被处理完毕&#xff0c;这种异步方式可以大大提高系统的处理速度、和吞吐量。 微服务架构&#xff0c;通常涉及多个服务之间的相互调用&#xff0c;如果通信只是在少数几个微…

lama-cleaner中的Paint-by-Example使用

Lama Cleaner是一个免费的、开源的、完全自托管的修复工具&#xff0c;里面提供了很多最前沿的AIGC模型。可以使用它从图片中删除任何不需要的物体、缺陷、人物&#xff0c;或删除和替换图片上的任何内容。本文章详细介绍了该工具的所有功能&#xff0c;并体验了下每个功能的实…

Shell编程之正则表达式与文本处理器

一、正则表达式 之前学习了 Shell 脚本的基础用法&#xff0c;已经可以利用条件判断、循环等语句编辑 Shell 脚本。接下来我们将开始介绍一个很重要的概念——正则表达式&#xff08;RegularExpression&#xff0c;RE&#xff09;。 1.1正则表达式概述 下面先来了解一下正则表…

BUUCTF---web---[BJDCTF2020]ZJCTF,不过如此

1、点开连接&#xff0c;页面出现了提示 传入一个参数text&#xff0c;里面的内容要包括I have a dream。 构造&#xff1a;?/textI have a dream。发现页面没有显示。这里推测可能得使用伪协议 在文件包含那一行&#xff0c;我们看到了next.php的提示&#xff0c;我们尝试读取…

卢文岩博士受邀参与中国科学院大学校友论坛 解码DPU核心价值

近日&#xff0c;第五届中国科学院大学校友创新论坛正式举行&#xff0c;本次论坛聚焦科技前沿领域&#xff0c;旨在搭建高端对话平台&#xff0c;促进产学研深度融合。在大算力时代——AI技术前沿沙龙上&#xff0c;中科驭数高级副总裁、CTO卢文岩博士受邀分享《DPU——连接算…

Mac | Mac 移动硬盘无法分区问题

现象问题 电脑配置&#xff1a;MacBook Pro M1&#xff0c;系统 Sonoma Mac 系统新升级了 Sonoma&#xff0c;结果出现各种问题。外接屏幕居然不能旋转 90 &#xff0c;查了一下是Sonoma系统导致的&#xff0c;以及莫名发热的问题。想着要么回退一下系统算了&#xff0c;于是网…

unity3D获取某天的0点和23点59分59秒

系列文章目录 unity工具 文章目录 系列文章目录unity工具 &#x1f449;一、前言&#x1f449;二、获取某一天的0点和23点59分59秒1-1.代码如下1-2.调用方法如下1-2-1.获取当天的时间1-2-2.获取某一天的时间 &#x1f449;三、当月第一天0时0分0秒&#x1f449;四、当月最后一…

3D点云焊缝提取 平面交线 投影

文章目录 1. 效果2. 思路3. 源码 1. 效果 2. 思路 计算点云法向量&#xff1b;计算点云位姿Pose;翻转Pose中的Z轴方向&#xff0c;使其一致&#xff1b;通过Pose的Z轴对点云进行方向过滤&#xff1b;对点云聚类&#xff1b;根据目标点云的高度提取目标点云&#xff1b;提取两块…

从 0 开始实现一个博客系统 (SSM 项目)

相关技术 Spring Spring Boot Spring MVC MyBatis Html Css JS pom 文件我就不放出来了, 之前用的 jdk8 做的, MySQL 用的 5.7, 都有点老了, 你们自己看着配版本就好 实现功能 用户注册 - 密码加盐加密 (md5 加密)前后端用户信息存储 - 令牌技术用户登录 - (使用 拦截…

外汇天眼:风险预警!以下平台监管牌照被撤销!

监管信息早知道&#xff01;外汇天眼将每周定期公布监管牌照状态发生变化的交易商&#xff0c;以供投资者参考&#xff0c;规避投资风险。如果平台天眼评分过高&#xff0c;建议投资者谨慎选择&#xff0c;因为在外汇天眼评分高不代表平台没问题&#xff01; 以下是监管牌照发生…

DISCO: Disentangled Control for Realistic Human Dance Generation

NTU&Microsoft CVPR24https://github.com/Wangt-CN/DisCo 问题引入 提高human motion transfer模型的泛化性&#xff1b;给出 f , g f,g f,g作为参考图片的前背景&#xff0c;然后给出单个pose p p t pp_t ppt​或者pose序列 p { p 1 , p 2 , ⋯ , p T } p \{p_1,p_2…

流水账(CPU设计实战)——lab3

Lab3 Rewrite V1.0 版本控制 版本描述V0V1.0相对V0变化&#xff1a; 修改了文件名&#xff0c;各阶段以_stage结尾&#xff08;因为if是关键词&#xff0c;所以module名不能叫if&#xff0c;遂改为if_stage&#xff0c;为了统一命名&#xff0c;将所有module后缀加上_stage&a…

杭州威雅学校:在学业与生活平衡中找到更好的自己

进入威雅杭州校园&#xff0c; 沿湖边小道步行约5分钟&#xff0c; 四栋寄宿学院与教学区隔湖相望&#xff0c; 威雅人更喜欢叫他们&#xff1a; 「Cavell」&「Dove」 「Elgar」&「Hawking」 提起「寄宿制」&#xff0c;人们本能地会把它和「住校」划等号。 这种…

css中实现背景方格

background: rgba(241,241,241,0.1); background-image:linear-gradient(90deg, rgba(241,243,244,1) 10%, transparent 0),linear-gradient(rgba()241,243,244,1 10%, transparent 0); background-size: 10px 10px; 表现出来的样子就是这个样子

96.网络游戏逆向分析与漏洞攻防-ui界面的设计-角色管理功能的界面设计

免责声明&#xff1a;内容仅供学习参考&#xff0c;请合法利用知识&#xff0c;禁止进行违法犯罪活动&#xff01; 如果看不懂、不知道现在做的什么&#xff0c;那就跟着做完看效果&#xff0c;代码看不懂是正常的&#xff0c;只要会抄就行&#xff0c;抄着抄着就能懂了 内容…

机器之心 | 清华接手,YOLOv10问世:性能大幅提升,登上GitHub热榜

本文来源公众号“机器之心”&#xff0c;仅用于学术分享&#xff0c;侵权删&#xff0c;干货满满。 原文链接&#xff1a;清华接手&#xff0c;YOLOv10问世&#xff1a;性能大幅提升&#xff0c;登上GitHub热榜 相同性能情况下&#xff0c;延迟减少 46%&#xff0c;参数减少 2…

超市进销存|基于SprinBoot+vue的超市进销存系统(源码+数据库+文档)

超市进销存系统 目录 基于SprinBootvue的超市进销存系统 一、前言 二、系统设计 三、系统功能设计 1 登录注册 2 管理员功能模块 3员工功能模块 四、数据库设计 五、核心代码 六、论文参考 七、最新计算机毕设选题推荐 八、源码获取&#xff1a; 博主介绍&#x…

多系统集成的项目周期为何普遍较长?

在现代企业的运营中&#xff0c;各种信息系统的集成已成为提升效率和竞争力的关键。然而&#xff0c;当工厂的ERP系统需要与MES、SRM、WMS、CRM等其他系统集成时&#xff0c;项目周期往往长达一年以上&#xff0c;这不仅耗费时间、人力和财力&#xff0c;还可能影响企业的正常运…

开发者的福音:免去搭建服务,让你的应用开发变得像吃蛋糕一样简单!

传统应用开发的"噩梦" 想象一下&#xff0c;你正在准备一场盛大的晚宴&#xff0c;但必须从零开始建造厨房、种植食材、甚至学习烹饪技巧。这就是传统应用开发的现状——你不仅要设计数据库、编写API接口&#xff0c;还要处理对象存储、实时数据库、云数据库等一系列…