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,借助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();
        }
    }
     
    

    八皇后参考文章

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【openlayers系统学习】3.3假彩色图像合成(三个波段合成假彩色图像)

三、假彩色图像合成 在上一步中&#xff0c;我们使用 ol/source/GeoTIFF​ 源从单个多波段源&#xff08;具有红色、绿色、蓝色和Alpha波段&#xff09;渲染真彩色图像。在下面这个例子中&#xff0c;我们将从可见光谱之外提取数据&#xff0c;并使用它来呈现假彩色合成。 我…

快消终端门店真实性新玩法:全流程校验+多元认证多重保障

在某饮品企业会议室&#xff0c;气氛凝重。城市经理一脸严肃地扫视着团队成员&#xff0c;小李、小张和小陈等人在这锐利的目光下显得有些局促不安。 城市经理沉声开口&#xff1a;小李上报的“幸福超市”’新店在XX大街上并不存在。这是怎么回事&#xff1f; 小李支吾着回答…

javaIO流知识点概况

一、前言&#xff1a; 1.1.流的概念: java将输入与输出比喻为"流"&#xff0c;英文:Stream. 就像生活中的"电流","水流"一样,它是以同一个方向顺序移动的过程.只不过这里流动的是字节(2进制数据).所以在IO中有输入流和输出流之分,我们理解他们…

【RabbitMQ】使用SpringAMQP的Publish/Subscribe(发布/订阅)

Publish/Subscribe **发布(Publish)、订阅(Subscribe)&#xff1a;**允许将同一个消息发送给多个消费者 **注意&#xff1a;**exchange负责消息路由&#xff0c;而不是存储&#xff0c;路由失败则消息丢失 常见的**X(exchange–交换机)***类型&#xff1a; Fanout 广播Direc…

SPP/BLE蓝牙双模方案,主从一体,串口速率可达85KB/S

MS-BTD020A是一款蓝牙5.0双模数传模块&#xff0c;支持SPP&#xff08;经典蓝牙&#xff09;和BLE&#xff08;低功耗蓝牙&#xff09;。蓝牙双模技术使其能够在传统蓝牙和低功耗蓝牙之间无缝切换&#xff0c;用户只需要进行简单的设置就可以实现串口与手机之间的无线传输。模块…

【每日一坑】KiCAD 覆铜区域约束

【每日一坑】 1.螺丝孔周围不想要要铜皮&#xff1b; 2、首先在CTRLshiftK;画一个区域&#xff0c;比如铺一个GND; 3、选择CUTOUT; 4、画线&#xff0c;画好闭合图形&#xff1b;如下图 5、就是这样了&#xff0c;就是还没有画圆或者异形的&#xff1b;

Scikit-Learn随机森林

Scikit-Learn随机森林 1、随机森林1.1、集成学习1.2、Bagging方法1.3、随机森林算法1.4、随机森林的优缺点2、Scikit-Learn随机森林回归2.1、Scikit-Learn随机森林回归API2.2、随机森林回归实践(加州房价预测)1、随机森林 随机森林是一种由决策树构成的集成算法,它在大多情况…

香橙派 AiPro通过Micro USB接口进行串口调试

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、配置步骤1.安装CH343驱动2.配置串口参数 二、使用步骤总结 前言 最近在玩一个新玩具香橙派 AiPro&#xff0c;除了通过SSH方式连接开发板以外&#xff0c;…

Llama模型家族训练奖励模型Reward Model技术及代码实战(二)从用户反馈构建比较数据集

LlaMA 3 系列博客 基于 LlaMA 3 LangGraph 在windows本地部署大模型 &#xff08;一&#xff09; 基于 LlaMA 3 LangGraph 在windows本地部署大模型 &#xff08;二&#xff09; 基于 LlaMA 3 LangGraph 在windows本地部署大模型 &#xff08;三&#xff09; 基于 LlaMA…

设计模式:外观模式 导诊台。空指针异常

文章目录 UML类图目录结构思路Register.javaOutpatientService.javaPrice.javaPharmacy.javaFacade.java空指针异常 Test.java UML类图 目录结构 思路 照着写&#xff0c;然后getRegister&#xff08;&#xff09;方法的具体实现就是&#xff1a;打印一句话&#xff0c;然后到…

服务器端口查询:一项至关重要的网络管理任务

在网络管理和系统维护中&#xff0c;服务器端口查询是一项至关重要的任务。服务器端口是网络通信的入口点&#xff0c;它们允许各种服务和应用程序在网络上进行交互。因此&#xff0c;准确而有效地查询服务器端口的状态和配置对于确保网络的安全性和稳定性至关重要。 首先&…

floodfill 算法(上)

目录 图像渲染 题意&#xff1a; 题解&#xff1a; 非递归&#xff1a; 递归&#xff1a; 岛屿数量 题解&#xff1a; 非递归&#xff1a; 递归&#xff1a; 岛屿的最大面积 题解&#xff1a; 非递归&#xff1a; 递归&#xff1a; 被围绕的区域 题解&#xff1a…

10G SFP双口万兆以太网控制器,高速光口网络接口卡

2-Port 10G SFP NIC 是一款高速网 络接口卡&#xff0c;采用了 PCI Express 3.0 x8 接口&#xff0c;支持双 端口万兆以太网&#xff0c;具有高性能、高可靠性、低功耗等 优点&#xff0c;是数据中心、云计算、虚拟化等领域的理想选 择。 支持多种网络协议&#xff0c;如 …

爱岗敬业短视频:成都科成博通文化传媒公司

爱岗敬业短视频&#xff1a;传递正能量&#xff0c;塑造职场新风尚 在当今社会&#xff0c;短视频以其独特的传播方式和广泛的受众群体&#xff0c;成为了信息传播的重要渠道。在众多短视频内容中&#xff0c;以“爱岗敬业”为主题的短视频尤为引人注目&#xff0c;成都科成博…

云衔科技:为什么推荐使用zoho crm客户管理系统?

在当今快速变化的商业环境中&#xff0c;企业对高效、智能化的客户关系管理&#xff08;CRM&#xff09;系统的需求日益增长。Zoho CRM&#xff0c;作为全球领先的企业级CRM解决方案提供商&#xff0c;凭借其全面的功能、高度的可定制性、以及无缝集成的生态系统&#xff0c;成…

无人机河道巡查方案,智能巡检助力水域监管革新

无人机技术的飞速发展为河道监管工作带来了创新的解决方案。无人机河道巡查以其高效、精准、智能的特点&#xff0c;正在逐步替代传统河道巡检方式&#xff0c;为水域管理提供了强有力的技术支持。 一、自主巡逻&#xff0c;提升河道监管效率 无人机河道巡查搭载先进的控制装置…

AI图书推荐:终极ChatGPT企业手册—借助Python和Java实现

《终极ChatGPT企业手册—借助Python和Java实现》&#xff08;Ultimate ChatGPT Handbook for Enterprises&#xff09;是一本关于ChatGPT的手册&#xff0c;旨在帮助企业利用AI能力、提示工程和ChatGPT的解决方案循环来改变企业景观。这本书提供了深入探讨ChatGPT的演变、能力以…

牛客NC362 字典序排列【中等 DFS Java/Go/PHP】

题目 题目链接&#xff1a; https://www.nowcoder.com/practice/de49cf70277048518314fbdcaba9b42c 解题方法 DFS&#xff0c;剪枝Java代码 import java.util.*;public class Solution {/*** 代码中的类名、方法名、参数名已经指定&#xff0c;请勿修改&#xff0c;直接返回…

深入了解 CSS 预处理器 Sass

今天我们来深入探讨一下 CSS 预处理器 Sass。我们将学习什么是 Sass,如何使用它,以及它是如何工作的。 什么是 Sass? Sass 是 syntactically awesome style sheets 的缩写,是一种 CSS 预处理器。它是 CSS 的扩展,为基础 CSS 增加了更多的功能和优雅。普通的 CSS 代码很容…

BUG: VS Code C++输出中文乱码

BUG: VS Code C输出中文乱码 环境 Windows 11 VS Code 编辑器详情 在Windows 使用 cout 函数输出中文时出现乱码 问题的原因在cmd的显示编码和c程序编码的不同。cmd默认的是gbk编码&#xff0c;而VS Code 软件的CMD终端默认是utf-8编码&#xff0c;因而在输出中文文本时会出…