java第十七课 —— 递归

news2024/12/23 13:53:56

方法递归调用

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

递归重要规则

  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,借助c
    			move(num - 1, a, c, b); //先移动上面所有的盘到 b,借助c
    			System.out.println(a + " --> " + c); //把最下面的这个盘,移动到c
    			move(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.coloradmin.cn/o/1709951.html

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

相关文章

【CTF Web】CTFShow web11 Writeup(RCE+PHP+代码审计)

web11 1 阿呆听完自己菜死了&#xff0c;自己呆了。决定修好漏洞&#xff0c;绝对不能让自己再菜死了。 解法 可知 flag 在 config.php。 <?php # flag in config.php include("config.php"); if(isset($_GET[c])){$c $_GET[c];if(!preg_match("/system…

Maven高级详解

文章目录 一、分模块开发与设计分模块开发的意义模块拆分原则 分模块开发(模块拆分)创建Maven模块书写模块代码通过maven指令安装模块到本地仓库(install指令) 二、依赖管理依赖传递可选依赖排除依赖可选依赖和排除依赖的区别 三、聚合与继承聚合工程聚合工程开发创建Maven模块…

专业的Java工程管理软件源码:详尽的项目模块及其功能点清单

在工程项目管理软件领域&#xff0c;我们致力于提供全过程、全方位的综合管理解决方案。该软件覆盖了建设工程项目管理组织建设、项目策划决策、规划设计、施工建设到竣工交付、总结评估、运维运营的各个环节&#xff0c;确保项目管理的全面性和高效性。 工程项目管理软件包含…

VirtualBox虚拟机与bhyve虚拟机冲突问题解决@FreeBSD

问题 在安装完bhyve虚拟系统的主机上启动VirtualBox虚拟机的时候&#xff0c;报错&#xff1a;不能为虚拟电脑 debian 打开一个新任务. VirtualBox cant operate in VMX root mode. Please close all other virtualization programs. (VERR_VMX_IN_VMX_ROOT_MODE). 返回 代码…

Vue从入门到实战Day12~14 - Vue3大事件管理系统

一、用到的知识 Vue3 compositionAPIPinia / Pinia持久化处理Element Plus(表单校验&#xff0c;表格处理&#xff0c;组件封装)pnpm 包管理升级Eslint prettier 更规范的配置husky&#xff08;Git hooks工具&#xff09;&#xff1a;代码提交之前&#xff0c;进行校验请求模…

上海一儿童写真馆摄影师大量售卖女童照片!当你的肖像权或隐私权被侵犯时应如何写起诉状?

上海一儿童写真馆摄影师大量售卖女童照片&#xff01;当你的肖像权或隐私权被侵犯时应如何写起诉状&#xff1f; 近日&#xff0c;上海市一儿童写真馆摄影师被指大量售卖女童的照片和特写花絮。对此&#xff0c; 上海市公安局徐汇分局发布了警情通报&#xff08;见下图&#x…

广场舞团|基于SprinBoot+vue的广场舞团系统(源码+数据库+文档)

广场舞团系统 目录 基于SprinBootvue的广场舞团系统 一、前言 二、系统设计 三、系统功能设计 1 系统功能模块 2 后台登录模块 5.2.1管理员功能模块 5.2.2社团功能模块 5.2.3用户功能模块 四、数据库设计 五、核心代码 六、论文参考 七、最新计算机毕设选题推…

【学习Day1】中央处理单元CPU

✍&#x1f3fb;记录学习过程中的输出&#xff0c;坚持每天学习一点点~ ❤️希望能给大家提供帮助~欢迎点赞&#x1f44d;&#x1f3fb;收藏⭐评论✍&#x1f3fb;指点&#x1f64f; 中央处理单元CPU 中央处理器&#xff08;CPU&#xff0c;central processing unit&#xff…

第97天:权限提升-Web 权限权限划分源码后台中间件第三方数据库等

前置知识 具体有哪些权限需要我们了解掌握的 后台权限&#xff0c;网站权限&#xff0c;数据库权限&#xff0c;接口权限&#xff0c;系统权限&#xff0c;域控权限等 以上常见权限获取方法简要归类说明 后台权限&#xff1a;SQL 注入,数据库备份泄露&#xff0c;默认或弱口…

对象解构与迭代器的猫腻?

前言 变量的解构赋值是前端开发中经常用到的一个技巧&#xff0c;比如&#xff1a; // 对象解构 const obj { a: 1, b: 2 }; const { a, b } obj; console.log(a, b)数组解构 const arr [1, 2, 3]; const [a, b] arr; console.log(a, b)工作中我们最经常用的就是类似上面…

全球伦敦银收盘时间一致吗

跟伦敦金市场相似&#xff0c;伦敦银市场也是一个全球化的无形市场&#xff0c;无论来自世界上什么地方的投资者参与其中&#xff0c;都可以得到全天接近24个小时的连贯行情&#xff0c;只要精力足够&#xff0c;根本不用担心没有交易获利的机会。但由于交易平台始终有维护的需…

exe4j --实现把jar包打成exe可执行文件

工具准备 1.Java编辑器&#xff0c;如&#xff1a;idea、eclipse等&#xff0c;下载地址&#xff1a; IntelliJ IDEA: The Capable & Ergonomic Java IDE by JetBrains https://www.jetbrains.com/idea/ 2.exe4j&#xff0c;下载地址&#xff1a; ej-technologies - Java A…

python fstring教程(f-string教程)(python3.6+格式化字符串方法)

文章目录 Python F-String 教程&#xff1a;深度探究与实用指南引言基础用法什么是F-String?表达式嵌入 格式化选项小数点精度宽度与对齐数字格式化 高级用法复杂表达式调用函数多行F-String嵌套格式化 总结 Python F-String 教程&#xff1a;深度探究与实用指南 引言 在Pyt…

mongodb数据库备份到远程机器

一、背景 生产环境的mongodb数据库是直接购买阿里云的云数据库&#xff0c;但是在公司研发环境&#xff0c;我们是自己手动部署的。开发和测试的数据当然没有生产环境那么重要&#xff0c;但备份也是必要的&#xff0c;只不过容忍一定的数据丢失。 二、备份脚本 vi /etc/cro…

R实验 参数估计

实验目的&#xff1a; 掌握矩法估计与极大似然估计的求法&#xff1b;了解估计量的优良性准则&#xff1a;无偏性、有效性、相合性&#xff08;一致性&#xff09;&#xff1b;学会利用R软件完成一个正态总体均值和两个正态总体均值差的区间估计&#xff1b;学会利用R软件完成…

面试中算法(红包算法)

一、问题需求&#xff1a; 一个人在群里发了1个100元的红包&#xff0c;群里有5个人一起来抢红包&#xff0c;每人抢到的金额随机分配。 红包功能需要满足哪些具体规则呢? 1、所有人抢到的金额之和要等于红包金额&#xff0c;不能多也不能少。 2、每个人至少抢到1分钱。 3、要…

23ai中的True Cache到底能做啥?

最近&#xff0c;Oracle的产品管理总监在Oracle数据库内幕中介绍了True Cache。 原文链接如下&#xff1a; https://blogs.oracle.com/database/post/introducing-oracle-true-cache 由于这篇文章比较火爆&#xff0c;我们国内已经有很多的数据库爱好者完整的翻译这篇文章&am…

RAGFlow (https://github.com/infiniflow/ragflow/blob/main/README.md)

一个非常好的项目&#xff0c;可以让你用ollama部署的模型和自带rag的功能&#xff0c;界面也很清爽 几乎可以直接商用 使用教程看README.md就可以&#xff0c;从下面开始

DevOps实践:通过云效实现hexo自动构建部署发布

DevOps&#xff08;Development和Operations的组合词&#xff09;是一组过程、方法与系统的统称&#xff0c;用于促进开发&#xff08;应用程序/软件工程&#xff09;、技术运营和质量保障&#xff08;QA&#xff09;部门之间的沟通、协作与整合。这是一种重视“软件开发人员&a…

Clickhouse Bitmap 类型操作总结—— Clickhouse 基础篇(四)

文章目录 创建 Bitmap 对象Bitmap 转换为整数数组计算总数&#xff08;去重&#xff09;值指定start, end 索引生成子 Bitmap指定 start 索引和数量限制生成子 Bitmap指定偏移量生成子 Bitmap是否包含指定元素两个 Bitmap 是否存在相同元素一个是否为另一个 Bitmap 的子集求最小…