【韩顺平Java笔记】第7章:面向对象编程(基础部分)【214-226】

文章目录

  • 214. 递归解决什么问题
  • 215. 递归执行机制1
  • 216. 递归执行机制2
  • 217 递归执行机制3
  • 217.1 阶乘
  • 218. 递归执行机制4
  • 219. 斐波那契数列
  • 220. 猴子吃桃
  • 221. 222. 223. 224. 老鼠出迷宫1,2,3,4
    • 224.1 什么是回溯
  • 225. 汉诺塔
  • 226. 八皇后

214. 递归解决什么问题

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

215. 递归执行机制1

public class TestUse {public static void main(String[] args) {T t1 = new T();t1.test(4);}
}
class T{//分析public void test(int n){if(n > 2){test(n-1);}System.out.println("n=" + n);}
}

运行结果:
n=2
n=3
n=4
函数调用栈过程:

【注】每一个栈都会完整的执行方法,在哪里调用就在哪里返回。

216. 递归执行机制2

将上一节课的代码的if条件假如else如下

public void test(int n){if(n > 2){test(n-1);}else{System.out.println("n=" + n);}}

就变成结果只有
n=2
其函数调用栈相当于下图:

217 递归执行机制3

217.1 阶乘

public class TestUse {public static void main(String[] args) {T t1 = new T();int res = t1.factorial(5);System.out.println("5 的阶乘 res =" + res);}
}
class T{//分析public void test(int n){if(n > 2){test(n-1);}else{System.out.println("n=" + n);}}//factorialpublic int factorial(int n){if(n == 1){return 1;}else{return factorial(n-1)*n;}}
}

运行结果:
5 的阶乘 res =120

218. 递归执行机制4

219. 斐波那契数列

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

public class TestUse {public static void main(String[] args) {T t1 = new T();int n = 7;int res = t1.fib(n);if(res != -1) {System.out.println("当 n="+ n +" 对应的斐波那契数=" + res);}}
}
class T{//Fib数列public int fib(int n){//n小于等于0,提示数据不合法退出if(n <= 0){System.out.println("数据不合法!");return -1;}//第1项和第2项都是1,//第3项开始//fib(n) = fib(n-1) + fib(n-2)if(n == 1 || n == 2){return 1;}else{return fib(n-1) + fib(n-2);}}
}

运行结果:
当 n=7 对应的斐波那契数=13

220. 猴子吃桃

猴子吃桃子问题:有一堆桃子,猴子第一天吃了其中的一半,并再多吃了一个,以后每天猴子都吃其中的一半,然后再多吃一个。当到第10天时,想再吃时(即还没吃),发现只有1个桃子了。问题:最初共多少个桃子?(我以前写过一个循环的版本,现在用递归写,看来有些数据要写死了,比如第10天就得固定下来)

public class TestUse {public static void main(String[] args) {T t1 = new T();//桃子问题int day = 1;int peachNum = t1.func(day);if(peachNum != -1) {System.out.println("第 " + day + "天有" + peachNum + "个桃子");}}
}
class T{//求解猴子吃桃问题//设func(day)表示day天吃桃子前的桃子数量//day当天吃掉了func(day) / 2 + 1//day当天还剩下func(day) - (func(day) / 2 + 1)=func(day) / 2 - 1//则func(day) = (当天剩下的 + 1)*2//day = 10,剩下1个桃子,func(10) = (1 + 1) * 2//dat = 9,剩下4个桃子,func(9) = (4 + 1) * 2//day = 8,剩下10个桃子,func(8) = (10 + 1) * 2//得出公式,func(day) = (当天剩下的(即下一天的桃子总数func(day + 1)) + 1)*2public int func(int day){//第10天的时候,跳出递归,返回1(剩下1个桃子)if(day == 10){return 1;}else if(day >= 1 && day <= 9){//在其他天数返回刚才推理的公式return (func(day + 1) + 1) * 2;}else{System.out.println("day 在 1-10");return -1;}}
}

运行结果:
第 1天有1534个桃子

221. 222. 223. 224. 老鼠出迷宫1,2,3,4

public class TestUse {public static void main(String[] args) {//设置二维数组表示迷宫//8x7二维数组int[][] map = new int[8][7];//0表示可以走,1表示障碍物//将最上面一行和最下面一行,全部设置为1for(int i = 0; i < 7;i++){map[0][i] = 1;map[7][i] = 1;}//最左侧和最右侧列都设置为1for(int j = 0; j < 8;j++){map[j][0] = 1;map[j][6] = 1;//一共7列,最后一列下标为7-1 == 6}//第4行第2,3列元素也是障碍物map[3][1] = 1;map[3][2] = 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] + "\t");}System.out.println();}//使用findWay给老鼠找路T t1 = new T();t1.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] + "\t");}System.out.println();}}
}
class T{//使用递归回溯的思想来解决老鼠出迷宫//findWay方法就是专门来找迷宫的路径//如果找到返回true,否则返回false//map就是二维数组,即表示迷宫//初始位置在下标(1,1),老鼠到达(6,5)代表出迷宫//i,j就是老鼠现在的位置,初始化为(1,1)//因为我们是递归的找路,所以我先规定 map数组的各个值得含义//0可以走 1表示障碍物 2表示可以走(老鼠走过的路径) 3曾经走过但是死路//map[6][5] = 2,即到终点,能走通//先确定老鼠找路得策略,下->右->上->左public boolean findWay(int[][] map, int i, int j){if(map[6][5] == 2){return true;//找到}else{//当前这个位置0,说明可以走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, 3return false;//}}}
}

运行结果:
当前地图情况:
1 1 1 1 1 1 1
1 0 0 0 0 0 1
1 0 0 0 0 0 1
1 1 1 0 0 0 1
1 0 0 0 0 0 1
1 0 0 0 0 0 1
1 0 0 0 0 0 1
1 1 1 1 1 1 1
老鼠找路情况:
1 1 1 1 1 1 1
1 2 0 0 0 0 1
1 2 2 2 0 0 1
1 1 1 2 0 0 1
1 0 0 2 0 0 1
1 0 0 2 0 0 1
1 0 0 2 2 2 1
1 1 1 1 1 1 1

修改策略:上右下左

public class TestUse {public static void main(String[] args) {//设置二维数组表示迷宫//8x7二维数组int[][] map = new int[8][7];//0表示可以走,1表示障碍物//将最上面一行和最下面一行,全部设置为1for(int i = 0; i < 7;i++){map[0][i] = 1;map[7][i] = 1;}//最左侧和最右侧列都设置为1for(int j = 0; j < 8;j++){map[j][0] = 1;map[j][6] = 1;//一共7列,最后一列下标为7-1 == 6}//第4行第2,3列元素也是障碍物map[3][1] = 1;map[3][2] = 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] + "\t");}System.out.println();}//使用findWay给老鼠找路T t1 = new T();t1.findWay2(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] + "\t");}System.out.println();}}
}
class T{//使用递归回溯的思想来解决老鼠出迷宫//findWay方法就是专门来找迷宫的路径//如果找到返回true,否则返回false//map就是二维数组,即表示迷宫//初始位置在下标(1,1),老鼠到达(6,5)代表出迷宫//i,j就是老鼠现在的位置,初始化为(1,1)//因为我们是递归的找路,所以我先规定 map数组的各个值得含义//0可以走 1表示障碍物 2表示可以走(老鼠走过的路径) 3曾经走过但是死路//map[6][5] = 2,即到终点,能走通//先确定老鼠找路得策略,下->右->上->左public boolean findWay(int[][] map, int i, int j){if(map[6][5] == 2){return true;//找到}else{//当前这个位置0,说明可以走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, 3return false;//}}}//修改策略,看看路径是否有变化//下->右->上->左  ==> 上->右->下->左public boolean findWay2(int[][] map, int i, int j){if(map[6][5] == 2){return true;//找到}else{//当前这个位置0,说明可以走if(map[i][j] == 0){//我们假定可以走通map[i][j] = 2;//使用策略,来确定该位置是否真的可以走通//先尝试向上走if(findWay2(map, i - 1, j)){return true;}//走不通,再尝试向右走else if(findWay2(map, i, j+1)){return true;}//走不通,再尝试向下走else if(findWay2(map, i + 1, j)){return true;}//走不通,再尝试向左走else if(findWay2(map, i, j - 1)){return true;}//四个方向都走不通,说明假定能走通是错的else{map[i][j] = 3;return false;}}else{//map[i][j] = 1, 2, 3return false;//}}}
}

运行结果:
当前地图情况:
1 1 1 1 1 1 1
1 0 0 0 0 0 1
1 0 0 0 0 0 1
1 1 1 0 0 0 1
1 0 0 0 0 0 1
1 0 0 0 0 0 1
1 0 0 0 0 0 1
1 1 1 1 1 1 1
老鼠找路情况:
1 1 1 1 1 1 1
1 2 2 2 2 2 1
1 0 0 0 0 2 1
1 1 1 0 0 2 1
1 0 0 0 0 2 1
1 0 0 0 0 2 1
1 0 0 0 0 2 1
1 1 1 1 1 1 1

224.1 什么是回溯


在下标(2,2)处设置障碍物,小球先向下走,可以走通,到达下标(1,2),然后测试发现上下左右都走不通(上走不通是因为之前走过1,1下标点),于是它回到上一个栈,然后根据刚才走的情况,判断向右走

后面能用数据结构算法求出最短路径

225. 汉诺塔

汉诺塔:汉诺塔(又称河内塔)问题是源于印度一个古老传说的益智玩具。大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着 64 片圆盘。大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上。并且规定,在小圆盘上不能放大圆盘,在三根柱子之间一次只能移动一个圆盘。
假如每秒钟移动一次,共需多长时间呢?移完这些金片需要 5845.54 亿年以上,太阳系的预期寿命据说也就是数百亿年。真的过了 5845.54 亿年,地球上的一切生命,连同梵塔、庙宇等,都早已经灰飞烟灭

  • 思路
    如果A塔只有一个盘子,直接从A塔移动到C塔
    如果A塔有很多盘子,把最后一个盘子上面的所有盘子视为一个盘子,将A塔上面这个盘子堆移动到B塔,然后将A塔最下面的盘子移动到C塔,最后将B塔这一堆移动到C塔,递归思想只考虑这个中间过程和跳出递归的过程。
public class TestUse {public static void main(String[] args) {T t = new T();t.move(5, 'A', 'B', 'C');}
}
class T{//n是盘子数,a,b,c是三个塔,C是此次调用move要移动到的位置,A是此次调用时,某个要移动的盘子所在的位置,确定A C后,B也就能确定了public void move(int n, char a, char b, char c){//n<1,提示数据不合法if(n < 1){System.err.println("数据不合法!");}//如果只有一个盘,直接从A移动到Cif(n == 1){System.out.println(a + "->" + c);}else{//有多个盘子,先将上面n-1个盘子视为一个整体,移动到B,借助C,move的参数c是要移动的位置move(n-1, a, c, b);//把下面这个盘移动到CSystem.out.println(a + "->" + c);//再把B塔的所有盘移动到C,借助A//c = c, a = b,剩下 amove(n-1, b, a, c);}}
}

运行结果:
A->C
A->B
C->B
A->C
B->A
B->C
A->C
A->B
C->B
C->A
B->A
C->B
A->C
A->B
C->B
A->C
B->A
B->C
A->C
B->A
C->B
C->A
B->A
B->C
A->C
A->B
C->B
A->C
B->A
B->C
A->C

226. 八皇后

八皇后问题,是一个古老而著名的问题,是回溯算法的典型案例。该问题是国际西洋棋棋手马克斯·贝瑟尔于 1848 年提出:在 8×8 格的国际象棋上摆放八个皇后,使其不能互相攻击,即:任意两个皇后都不能处于同一行、同一列或同一斜线上,问有多少种摆法。

public class TestUse {public static void main(String[] args) {int arr[] = new int[8];T t = new T();t.eightQueen(arr, 0);}
}
class T{public int solNum = 0;//记录解法个数的成员//八皇后,n表示所在行数,如果n为棋盘行数,则说明已经放好了//即跳出递归的条件//max是棋盘行数public void eightQueen(int[] arr, int n){if(n == arr.length){//放好后打印八皇后solNum++;System.out.println("解法" + solNum + ":");for (int i = 0; i < arr.length; i++) {for (int j = 0; j < arr.length; j++) {//如果arr[i]==j,打印,对应的是下标i行j列有皇后if(arr[i] == j){System.out.print("o\t");}else{System.out.print("#\t");}}System.out.println();}return;}//依次在第n行放入皇后判断是否冲突,i代表当前行的列下标for (int i = 0; i < arr.length; i++) {//假定可以放arr[n] = i;//判断是否可以放,如果可以则继续放if(judge(arr, n)){eightQueen(arr, n+1);}}}//判断当前位置是否可行的方法public boolean judge(int[] arr, int n){//判断当前位置是否有冲突for(int j = 0; j < n; j++){//n+1是当前第n+1个皇后arr[n]//如果当前皇后和前n+1-1=n个皇后在同一列或者同一对角线上,就发生冲突,则返回falseif(arr[j] == arr[n] || Math.abs(n - j) == Math.abs(arr[n] - arr[j])){return false;}}//全部走一遍,前n个没问题,就说明可以放置return true;}
}

运行结果
……太长了,直接看最后
解法92:
# # # # # # # o
# # # o # # # #
o # # # # # # #
# # o # # # # #
# # # # # o # #
# o # # # # # #
# # # # # # o #
# # # # o # # #

一共是92种解法,确实难想到,我也是查了好多资料,本科算法课忘得差不多了。

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

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

相关文章

[Meachines] [Easy] Sea WonderCMS-XSS-RCE+System Monitor 命令注入

信息收集 IP AddressOpening Ports10.10.11.28TCP:22&#xff0c;80 $ nmap -p- 10.10.11.28 --min-rate 1000 -sC -sV PORT STATE SERVICE VERSION 22/tcp open ssh OpenSSH 8.2p1 Ubuntu 4ubuntu0.11 (Ubuntu Linux; protocol 2.0) | ssh-hostkey: | 3072 e3:54:…

Python3使用cv_bridge转换ROS的image信息

0. Preface 现在很多新的图片处理model都是基于python3的&#xff0c;而ROS还是2.7的&#xff0c;要结合起来用不可避免有很多问题&#xff0c;以下以接收ROS image为例子 以下方法需要用的anaconda&#xff0c;安装方法有很多blog分享 1. Preparation 以下是python3接收ima…

解锁 SDKMAN!:最新教程与全面简介

SDKMAN! 是一个用于管理开发工具的软件开发工具包管理器,特别适用于 JVM 生态系统。 官网地址:https://sdkman.io/ 多版本管理:允许用户在同一台机器上安装和管理多个版本的 SDK(如 Java、Groovy、Scala、Kotlin 等)。 简单安装:通过简单的命令行命令可以安装、更新和卸载…

15分钟学 Python 第36天 :Python 爬虫入门(二)

Python 爬虫入门&#xff1a;环境准备 在进行Python爬虫的学习和实践之前&#xff0c;首先需要准备好合适的开发环境。本节将详细介绍Python环境的安装、必要库的配置、以及常用工具的使用&#xff0c;为后续的爬虫编写奠定坚实的基础。 1. 环境准备概述 1.1 为什么环境准备…

OpenAI为ChatGPT推出Canvas功能,对标Claude Artifacts!

大家好&#xff0c;我是木易&#xff0c;一个持续关注AI领域的互联网技术产品经理&#xff0c;国内Top2本科&#xff0c;美国Top10 CS研究生&#xff0c;MBA。我坚信AI是普通人变强的“外挂”&#xff0c;专注于分享AI全维度知识&#xff0c;包括但不限于AI科普&#xff0c;AI工…

Pikachu-File Inclusion-远程文件包含

远程文件包含漏洞 是指能够包含远程服务器上的文件并执行。由于远程服务器的文件是我们可控的&#xff0c;因此漏洞一旦存在&#xff0c;危害性会很大。但远程文件包含漏洞的利用条件较为苛刻&#xff1b;因此&#xff0c;在web应用系统的功能设计上尽量不要让前端用户直接传变…

多模态—文字生成图片

DALL-E是一个用于文字生成图片的模型&#xff0c;这也是一个很好思路的模型。该模型的训练分为两个阶段&#xff1a; 第一阶段&#xff1a;图片经过编码器编码为图片向量&#xff0c;当然我们应该注意这个过程存在无损压缩&#xff08;图片假设200*200&#xff0c;如果用one-h…

Vue2基础指令

Vue2基础指令 Vue使用核心步骤&#xff08;4步&#xff09;&#xff1a; 准备容器引包&#xff08;官网&#xff09; — 开发版本/生产版本创建Vue实例 new Vue()指定配置项&#xff0c;渲染数据 el:指定挂载点data提供数据 <body><div id"app"><…

国外透明代理IP解析:匿名性的全貌

网络世界中&#xff0c;透明代理IP是一个广受关注的话题。究竟什么国外透明代理IP&#xff1f;以及它的匿名性如何&#xff1f;本文将深入解析透明代理IP的定义及其匿名性&#xff0c;为您呈现一个清晰的认识。 1. 概念 透明代理IP是指在进行网络请求时&#xff0c;客户端&am…

黑马JavaWeb开发跟学(九)MyBatis基础操作

黑马JavaWeb开发跟学九.MyBatis基础操作 1. Mybatis基础操作1.1 需求1.2 准备1.3 删除1.3.1 功能实现1.3.2 日志输入1.3.3 预编译SQL1.3.3.1 介绍1.3.3.2 SQL注入1.3.3.3 参数占位符 1.4 新增1.4.1 基本新增1.4.2 主键返回 1.5 更新1.6 查询1.6.1 根据ID查询1.6.2 数据封装1.6.…

【MySQL 08】复合查询

目录 1.准备工作 2.多表查询 笛卡尔积 多表查询案例 3. 自连接 4.子查询 1.单行子查询 2.多行子查询 3.多列子查询 4.在from子句中使用子查询 5.合并查询 1.union 2.union all 1.准备工作 如下三个表&#xff0c;将作为示例&#xff0c;理解复合查询 EMP员工表…

MongoDB-aggregate流式计算:带条件的关联查询使用案例分析

在数据库的查询中&#xff0c;是一定会遇到表关联查询的。当两张大表关联时&#xff0c;时常会遇到性能和资源问题。这篇文章就是用一个例子来分享MongoDB带条件的关联查询发挥的作用。 假设工作环境中有两张MongoDB集合&#xff1a;SC_DATA&#xff08;学生基本信息集合&…

【Java】JAVA知识总结浅析

Java是一门功能强大的编程语言&#xff0c;广泛应用于多个领域。Java的编程思想&#xff0c;包括面向过程和面向对象编程&#xff0c;Java的发展历史&#xff0c;各版本的特点&#xff0c;JVM原理&#xff0c;数据类型&#xff0c;Java SE与Java EE的区别&#xff0c;应用场景&…

Colorize: 0 variables Colorize is not activated for this file. VsCode

问题情况 解决步骤 1.找到setting.json文件 2.输入以下代码&#xff0c;保存setting.json文件 "colorize.languages": ["css", "javascript", "sass", "less", "postcss", "stylus", "xml"…

小程序 uniapp+Android+hbuilderx体育场地预约管理系统的设计与实现

目录 项目介绍支持以下技术栈&#xff1a;具体实现截图HBuilderXuniappmysql数据库与主流编程语言java类核心代码部分展示登录的业务流程的顺序是&#xff1a;数据库设计性能分析操作可行性技术可行性系统安全性数据完整性软件测试详细视频演示源码获取方式 项目介绍 用户 注册…

2024年7月大众点评全国酒吧前百名城市分析

在做一些城市分析、学术研究分析、商业选址、商业布局分析等数据分析挖掘时&#xff0c;大众点评的数据参考价值非常大&#xff0c;截至2024年7月&#xff0c;大众点评美食店铺剔除了暂停营业、停止营业后的最新数据情况分析如下。 分析研究的字段维度包括大众点评数字id、字母…

DMA 正点原子版

就是介绍一下dma&#xff0c;只能内存到外设&#xff0c;外设到内存&#xff0c;内存到内存&#xff0c;不能外设到外设这样进行数据传输 这个是 可以看这个表来查&#xff0c;哪个dma的哪个通道用来传输什么数据&#xff0c;这个是芯片固定好的&#xff0c;只能看表查&#xf…

汉代儒家对道家《老子》修改为儒家《道德经》

汉代儒家对道家《老子》修改为儒家《道德经》 汉代对《老子》文本的改造和诠释。在汉代&#xff0c;由于政治、社会和文化背景的变化&#xff0c;许多先秦典籍&#xff0c;包括《老子》&#xff0c;都经历了不同程度的修改和重新解释。这些改造不仅反映了当时的思想潮流&#…

grep的使用

cat .\test.log |grep 1 cat .\test.log |grep [23] cat .\test.log |grep [123\|124] cat .\test.log |grep 123\|124 cat .\test.log |grep -e 2.*d

IPS和IDS有啥区别

在网络安全领域&#xff0c;入侵检测系统 (IDS) 和入侵防御系统 (IPS) 是两种关键的技术&#xff0c;旨在保护网络免受各种威胁。这两者尽管名字相似&#xff0c;但在功能、配置、以及应用场景等方面都有着显著的差异。 入侵检测系统 (IDS) IDS 是一种被动监控系统&#xff0c…