【Java学习笔记】递归
递归(recursion
)
思想:把一个复杂的问题拆分成一个简单问题和子问题,子问题又是更小规模的复杂问题,循环往复
本质:栈的使用
递归的注意事项
-
(1)需要有递归出口,否者就会无限递归造成栈溢出
-
(2)每一次递归调用都会生成一个新的栈空间(即:执行一个方法时,就创建一个新的受保护的独立空间(栈空间)),代码继续从上往下执行,如果符合条件就会一直递归,直到递归出口,最后一层一层返回值,完成函数的调用
-
(3)方法的局部变量都是独立的,不会相互应影响
-
(4)当一个方法执行完毕,或者遇到
return
就会返回,遵守谁调用,就将结果返回给谁,同时当方法执行完毕或者返回时,该方法也就执行完毕
递归的内存机制分析
代码示例
public class Recursion01 {public static void main(String[] args) {Tt1 = newT();t1.test(4);//输出什么? n=2 n=3 n=4}}class T {public void test(int n) {if (n > 2) {test(n- 1);}System.out.println("n=" + n);}
}
内存视图分析
递归实例
案例一:阶乘问题(factorial
)
import java.util.Scanner;
public class recursion {public static void main(String[] args){Scanner input = new Scanner(System.in);object object = new object();System.out.print("input a number:");long n = input.nextLong();long result = object.factorial(n);System.out.print("factorial(" + n + ") is:" + result);}
}class object{public long factorial(long n){if(n == 1){return 1;}else{return n * factorial(n - 1);}}
}
案例二:猴子吃桃问题
有一堆桃子,猴子第一天吃了其中的一半,并再多吃了一个!以后每天猴子都吃其中的一半,然后再多吃一个。当到第 10 天时,想再吃时(即还没吃),发现只有 1 个桃子了。问题:最初共多少个桃子?
public class recursion {public static void main(String[] args){method t = new method();int res = t.peach(1);System.out.print(res);}
}class method{public int peach(int day){if(day == 10){return 1;} else if(day >= 1 && day <= 9){return ( peach(day + 1) + 1 ) * 2; // 枚举每天的情况找规律得到}else{return -1;}}
}
案例三:斐波那契数列
1,1,2,3,5,8,13…给你一个整数 n,求出它的值是多少?
特点:从第三个数开始,后一个数等于前面两个数之和
//斐波那契数列:1,1,2,3,5,8,13...public class recursion {public static void main(String[] args){method t = new method();int res = t.fibonacci(10);System.out.print(res);}
}class method{public int fibonacci(int n){if(n == 1 || n == 2){return 1;}else{return fibonacci(n - 1) + fibonacci(n - 2);}}
}//输出:55
案例四;汉诺塔
有趣的小故事
汉诺塔:汉诺塔(又称河内塔)问题是源于印度一个古老传说的益智玩具。大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序攥着 64 片圆盘。大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上。并且规定,在小圆盘上不能放大圆盘,在三根柱子之间一次只能移动一个圆盘。
假如每秒钟移动一次,共需多长时间呢?移完这些金片需要 5845.54 亿年以上,太阳系的预期寿命据说也就是数百亿年。真的过了 5845.54 亿年,地球上的一切生命,连同梵塔、庙宇等,都早已经灰飞烟灭。
思路分析:可以把这个问题拆分
-
(1)把最底层移动到
C塔
-
(2)把上面的
n-1
个圆盘看作整体,移动到B塔
-
(3)上面的
n-1
个圆盘又可以拆分成如上的问题,不断递归下去
//斐波那契数列:1,1,2,3,5,8,13...public class recursion {public static void main(String[] args){tower t = new tower();t.move(3, 'a', 'b', 'c');}
}class tower{// 移动的圆盘个数, A塔 ,B塔 , C塔public void move(int num, char a, char b, char c){if(num == 1){System.out.println(a + "->" + c);}else{// 把上面的 n-1 个圆盘从 a塔 移动到 b塔,中间借助 c 塔move(num -1, a, c, b);// 把最下面的圆盘移动到 c塔System.out.println(a + "->" + c);// 把 b塔 的所有盘移动到 c塔,中介借助 a塔move(num -1, b, a, c);}}
}//输出
a->c
a->b
c->b
a->c
b->a
b->c
a->c
迷宫问题
思路:运用二维数组表示迷宫,初始位置为(1,1),走到出口处,标记路线
-
0
表示可以走(还未被标记) -
1
表示障碍物 -
7
表示可以走(被标记后) -
3
表示走过,但是走不通是死路
代码示例
public class migong {public static void main(String[] args){int[][] map = new int[8][7];//标记墙面的部分for(int i = 0; i < 8; i++){map[i][0] = 1;map[i][6] = 1;}for(int i = 0; i < 7; i++){map[0][i] = 1;map[7][i] = 1;}map[3][1] = 1;map[3][2] = 1;// 回溯测试:辅助理解方法调用完成后栈空间释放,是如何返回的
// map[2][2] = 1;// 封闭路径,测试结果
// map[2][1] = 1;
// map[2][2] = 1;
// map[1][2] = 1;// 调用方法t finder = new t();finder.findway(map,1,1); // 起点是(1,1)//打印找路结果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.println("");}}
}class t{public boolean findway(int[][] map, int i, int j){// 找路策略:下右上左// 如果找到了就出口返回 trueif(map[6][5] == 7){return true;}else{if(map[i][j] == 0){//假设当前点使用探路策略可以走通,就说明可以和之前的点衔接起来构成一条可以走通的路线map[i][j] = 7;// 接着使用找路策略开始探路,验证当前点开始是否可以走通//往下走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;}// 都走不通,走过了但是走不通就标记为 3else{map[i][j] = 3;return false;}}else{ // 此时 map[i][j] = 1, 7, 3 ; 7 表示测试过了就不要再重复测试return false;}}}
}
理解:没走到一个点,就会递归的使用下->右->上->左
的方式进行探路,如果都走不通就会返回到上一次递归调用,继续探路,指导找到出口为止
相关文章:

【Java学习笔记】递归
递归(recursion) 思想:把一个复杂的问题拆分成一个简单问题和子问题,子问题又是更小规模的复杂问题,循环往复 本质:栈的使用 递归的注意事项 (1)需要有递归出口,否者就…...
DigitalOcean推出Valkey托管缓存服务
今天我们激动地宣布推出DigitalOcean的Valkey托管缓存服务,这是我们全新的托管数据库服务,能够无缝替换托管缓存(此前称为托管Redis)。Valkey托管缓存服务在你一直依赖的功能基础上,还提供了增强工具来支持你的开发需求…...
ASP.NET MVC 入门指南四
21. 高级路由配置 21.1 自定义路由约束 除了使用默认的路由约束,你还可以创建自定义路由约束。自定义路由约束允许你根据特定的业务逻辑来决定一个路由是否匹配。例如,创建一个只允许特定年份的路由约束: csharp public class YearRouteCo…...

使用vue的插值表达式渲染变量,格式均正确,但无法渲染
如图,作者遇到的问题为,输入以下代码 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><…...

leetcode 977. Squares of a Sorted Array
题目描述 双指针法一 用right表示原数组中负数和非负数的分界线。 nums[0,right-1]的是负数,nums[right,nums.size()-1]是非负数。 然后用合并两个有序数组的方法。合并即可。 class Solution { public:vector<int> sortedSquares(vector<int>&…...
Mysql常用函数解析
字符串函数 CONCAT(str1, str2, …) 将多个字符串连接成一个字符串。 SELECT CONCAT(Hello, , World); -- 输出: Hello WorldSUBSTRING(str, start, length) 截取字符串的子串(起始位置从1开始)。 SELECT SUBSTRING(MySQL, 3, 2); -- 输出: SQ…...

llamafactory-cli webui启动报错TypeError: argument of type ‘bool‘ is not iterable
一、问题 在阿里云NoteBook上启动llamafactory-cli webui报错TypeError: argument of type ‘bool’ is not iterable This share link expires in 72 hours. For free permanent hosting and GPU upgrades, run gradio deploy from the terminal in the working directory t…...
智能电子白板的设计与实现:从硬件选型到软件编程
摘要:本文围绕智能电子白板展开,详述其从硬件芯片与模块选型、接线布局,到软件流程图规划及关键代码编写等方面的设计与实现过程,旨在打造满足现代教育与商务会议需求的多功能智能设备。 注:有想法可在评论区或者看我个人简介。 一、引言 在现代教育与商务场景中,智能…...

机器学习——特征选择
特征选择算法总结应用 特征选择概述 注:关于详细的特征选择算法介绍详见收藏夹。...

Spring - 简单实现一个 Spring 应用
一、为什么需要学习Spring框架? 1.企业级开发标配 超过60%的Java项目都使用Spring生态(数据来源:JetBrains开发者报告)。 2.简化复杂问题 通过IoC和DI,告别new关键字满天飞的代码。 3.职业竞争力 几乎所有Java岗…...

css 数字从0开始增加的动画效果
项目场景: 提示:这里简述项目相关背景: 在有些时候比如在做C端项目的时候,页面一般需要一些炫酷效果,比如数字会从小值自动加到数据返回的值 css 数字从0开始增加的动画效果 分析: 提示:这里填…...

第十六届蓝桥杯 2025 C/C++组 旗帜
目录 题目: 题目描述: 题目链接: 思路: 思路详解: 代码: 代码详解: 题目: 题目描述: 题目链接: P12340 [蓝桥杯 2025 省 AB/Python B 第二场] 旗帜 -…...

利用无事务方式插入数据库解决并发插入问题
一、背景 由于项目中同一个网元,可能会被多个不同用户操作,而且操作大部分都是以异步子任务形式进行执行,这样就会带来并发写数据问题,本文通过利用无事务方式插入数据库解决并发插入问题,算是解决问题的一种思路&…...
云计算市场的重新分类研究
云计算市场传统分类方式,比如按服务类型分为IaaS、PaaS、SaaS,或者按部署模式分为公有云、私有云、混合云。主要提供计算资源、存储和网络等基础设施。 但随着AI大模型的出现,云计算市场可以分为计算云和智算云,智算云主要是AI模…...
【C语言练习】014. 使用数组作为函数参数
014. 使用数组作为函数参数 014. 使用数组作为函数参数示例1:使用数组作为函数参数并修改数组元素函数定义输出结果 示例2:使用数组作为函数参数并计算数组的平均值函数定义输出结果 示例3:使用二维数组作为函数参数函数定义输出结果 示例4&a…...
Java关键字解析
Java关键字是编程语言中具有特殊含义的保留字,不能用作标识符(如变量名、类名等)。Java共有50多个关键字(不同版本略有差异),下面我将分类详细介绍这些关键字及其使用方式。 一、数据类型相关关键字 1. 基…...

突破zero-RL 困境!LUFFY 如何借离线策略指引提升推理能力?
在大模型推理能力不断取得突破的今天,强化学习成为提升模型能力的关键手段。然而,现有zero-RL方法存在局限。论文提出的LUFFY框架,创新性地融合离线策略推理轨迹,在多个数学基准测试中表现卓越,为训练通用推理模型开辟…...
React Native本地存储方案总结
1. AsyncStorage(键值对存储) 适用场景:简单键值对存储(如用户配置、Token、缓存数据)。特点:异步、轻量、API 简单,但性能一般,不推荐存储大量数据。安装:npm install …...

基于Redis实现-附近商铺查询
基于Redis实现-附近查询 这个功能将使用到Redis中的GEO这种数据结构来实现。 1.GEO相关命令 GEO就是Geolocation的简写形式,代表地理坐标。Redis在3.2版本中加入到了对GEO的支持,允许存储地理坐标信息,帮助我们根据经纬度来检索数据&#…...

【java WEB】恢复补充说明
Server 出现javax.servlet.http.HttpServlet", according to the project’s Dynamic Web Module facet version (3.0), was not found on the Java Build Path. 右键项目 > Properties > Project Facets。Dynamic Web Module facet version选4.0即可 还需要在serv…...

安川机器人常见故障报警及解决办法
机器人权限设置 操作权限设置(如果密码不对,就证明密码被人修改) 编辑模式密码:无(一把钥匙,默认) 管理模式密码:999999999(9个9,二把钥匙) 安全模式密码:555555555(9个5,三把钥匙,权限最高,有的型号机器人,没有此模式,但最高密码为安全模式密码) 示教器…...

tiktok web X-Bogus X-Gnarly 分析
声明 本文章中所有内容仅供学习交流使用,不用于其他任何目的,抓包内容、敏感网址、数据接口等均已做脱敏处理,严禁用于商业用途和非法用途,否则由此产生的一切后果均与作者无关! 逆向过程 部分python代码 import req…...

kes监控组件安装
环境准备 创建监控用户 useradd -m -s /bin/bash -d /home/kmonitor kmonitor passwd k_monitor usermod –a –G kingbase kmonitor 检查java版本 java –version [kmonitorkingbase node_exporter]$ java -version java version "1.8.0_341" Java(TM) SE …...

React-Native Android 多行被截断
1. 问题描述: 如图所示: 2. 问题解决灵感: 使用相同的react-native代码,运行在两个APP(demo 和 project)上。demo 展示正常,project 展示不正常。 对两个页面截图,对比如下。 得出…...

深度学习【Logistic回归模型】
回归和分类 回归问题得到的结果都是连续的,比如通过学习时间预测成绩 分类问题是将数据分成几类,比如根据邮件信息将邮件分成垃圾邮件和有效邮件两类。 相比于基础的线性回归其实就是增加了一个sigmod函数。 代码 import matplotlib.pyplot as plt i…...

数据科学与计算
1.设计目标与安装 Seaborn 是一个建立在 Matplotlib 基础之上的 Python 数据可视化库,专注于绘制各种统计图形,以便更轻松地呈现和理解数据。Seaborn 的设计目标是简化统计数据可视化的过程,提供高级接口和美观的默认主题,使得用…...
Swift与iOS内存管理机制深度剖析
前言 内存管理是每一位 iOS 开发者都绕不开的话题。虽然 Swift 的 ARC(自动引用计数)极大简化了开发者的工作,但只有深入理解其底层实现,才能写出高效、健壮的代码,避免各种隐蔽的内存问题。本文将从底层原理出发&…...

怎样给MP3音频重命名?是时候管理下电脑中的音频文件名了
在处理大量音频文件时,给这些文件起一个有意义的名字可以帮助我们更高效地管理和查找所需的内容。通过使用专业的文件重命名工具如简鹿文件批量重命名工具,可以极大地简化这一过程。本文将详细介绍如何利用该工具对 MP3 音频文件进行重命名。 步骤一&am…...
当AI浏览器和AI搜索替代掉传统搜索份额时,老牌的搜索引擎市场何去何从。
AI搜索与传统搜索优劣势分析 AI搜索优势 理解和处理查询方式更智能:利用自然语言处理(NLP)和机器学习技术,能够更好地理解用户的意图和上下文,处理复杂的问答、长尾问题以及多轮对话,提供更为精准和相关的…...

快速上手非关系型数据库-MongoDB
简介 MongoDB 是一个基于文档的 NoSQL 数据库,由 MongoDB Inc. 开发。 NoSQL,指的是非关系型的数据库。NoSQL有时也称作Not Only SQL的缩写,是对不同于传统的关系型数据库的数据库管理系统的统称。 MongoDB 的设计理念是为了应对大数据量、…...