【Java学习笔记】递归

递归(recursion

思想:把一个复杂的问题拆分成一个简单问题和子问题,子问题又是更小规模的复杂问题,循环往复

本质:栈的使用

递归的注意事项


递归的内存机制分析

代码示例


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

案例四;汉诺塔

有趣的小故事

在这里插入图片描述

思路分析:可以把这个问题拆分

//斐波那契数列: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),走到出口处,标记路线

代码示例

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;}}}
}

理解:没走到一个点,就会递归的使用下->右->上->左的方式进行探路,如果都走不通就会返回到上一次递归调用,继续探路,指导找到出口为止

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

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

相关文章

渗透测试中的那些“水洞”:分析与防御

1. Nginx 版本泄露 风险分析&#xff1a; Nginx 默认会在响应头中返回 Server: nginx/x.x.x&#xff0c;攻击者可利用该信息匹配已知漏洞进行攻击。 防御措施&#xff1a; 修改 nginx.conf 配置文件&#xff0c;隐藏版本信息&#xff1a;server_tokens off;使用 WAF 进行信息…

基于C#开发的适合Windows开源文件管理器

使用DDD从零构建一个完整的系统 推荐一个功能强大且直观的开源文件管理器&#xff0c;适用于Windows平台。 01 项目简介 该项目是一个基于C#开发、开源的文件管理器&#xff0c;适用于Windows&#xff0c;界面UI美观、方便轻松浏览文件。此外&#xff0c;支持创建和提取压缩…

实习入职的总结

我是4月14号入职的&#xff0c;到现在差不多已经三个礼拜了&#xff0c;今天想总结一下这段时间的工作情况&#xff0c;并给学弟学妹们提供一些指引。 目前&#xff0c;我所在的公司是一家初创企业&#xff0c;专注于IPC安防领域。作为一名大专生&#xff0c;我深知自己的学历在…

Ubuntu 系统上部署 Kubernetes 的完整指南

Ubuntu 系统上部署 Kubernetes 的完整指南 一、环境准备&#xff08;Ubuntu 22.04/24.04&#xff09;1. 系统初始化2. 安装容器运行时&#xff08;containerd&#xff09;3. 安装 Kubernetes 组件&#xff08;kubeadm, kubelet, kubectl&#xff09; 二、部署 Kubernetes 集群1…

partition_pdf 和chunk_by_title 的区别

from unstructured.partition.pdf import partition_pdf from unstructured.chunking.title import chunk_by_titlepartition_pdf 和 chunk_by_title 初看有点像&#xff0c;都在"分块"&#xff0c;但是它们的本质完全不一样。 先看它们核心区别 partition_pdfchun…

基于深度学习的医疗诊断辅助系统设计

标题:基于深度学习的医疗诊断辅助系统设计 内容:1.摘要 随着医疗数据的爆炸式增长和深度学习技术的飞速发展&#xff0c;开发基于深度学习的医疗诊断辅助系统具有重要的现实意义。本研究的目的在于设计一个高效、准确的医疗诊断辅助系统&#xff0c;以辅助医生进行更精准的诊断…

Matlab/Simulink - BLDC直流无刷电机仿真基础教程(四) - PWM调制模拟

Matlab/Simulink - BLDC直流无刷电机仿真基础教程&#xff08;四&#xff09; - PWM调制模拟 前言一、PWM调制技术基本原理二、仿真模型中加入PWM调制三、逆变电路MOS管添加体二极管四、模拟添加机械负载五、仿真模型与控制框图文章相关模型文件下载链接参考链接 前言 本系列文…

Curl 全面使用指南

Curl&#xff08;Client URL&#xff09;是一个跨平台命令行工具&#xff0c;支持多种协议&#xff08;HTTP/HTTPS/FTP/SFTP等&#xff09;&#xff0c;用于数据传输、API调试、文件上传/下载等场景。以下从 核心功能、用户疑问解答、高级技巧 三方面系统总结&#xff0c;并整合…

PyTorch中“原地”赋值的思考

在开发一个PyTorch模块时&#xff0c;遇到了一个诡异的现象&#xff0c;将他描述出来就是下面这样&#xff1a; f[..., :p_index - 1] f[..., 1:p_index] 这个操作将f张量的部分数值进行左移&#xff0c;我在模型训练的时候还能正常跑&#xff0c;但是当我将模型部署到项目中…

什么是:云边端一体化架构

什么是云边端一体化架构 文章目录 什么是云边端一体化架构云、边、端云计算边缘计算终端设备 云边端一体化协同云边端一体化架构协同的流程云边端一体化架构协同的应用云边端一体化架构协同的价值云边端一体化架构协同未来发展趋势 云、边、端 云&#xff08;Cloud&#xff09…

gephi绘图

参考&#xff1a; 如何在Gephi中正确的显示中文&#xff1f; Gephi绘制网络图初步探索 gephi 节点标签 调节_图分析与可视化-从Gephi开始

马克·雷伯特:用算法让机器人飞奔的人

名人说:路漫漫其修远兮,吾将上下而求索。—— 屈原《离骚》 创作者:Code_流苏(CSDN)(一个喜欢古诗词和编程的Coder😊) 马克雷伯特:用算法让机器人飞奔的人 一、天才的起点 在机器人领域,有一个名字如雷贯耳——马克雷伯特(Marc Raibert)。作为波士顿动力公司(Boston…

三维装配可视化界面开发笔记

三维装配可视化界面开发笔记 项目概述 这是一个基于Vue.js和Three.js的三维装配可视化系统&#xff0c;用于展示机械零部件的装配和拆解过程。系统支持模型加载、拆解/装配路径生成、动画展示和工艺流程图生成等功能。 技术栈 前端框架: Vue 3 (使用组合式API)构建工具: Vi…

深⼊理解指针(8)

1.对上一篇的补充内容 typedef int* ptr_t #define PTR_T int* 这两种写法都是可以的 ptr_t p1, p2; //p1, p2 都是指针变量 PTR_T p3, p4; //p3 是指针变量, p4是整型变量 为什么p3 是指针变量, p4是整型变量呢&#xff1f; 因为PTR_T 真的被改为了 int* 在编译器中…

neo4j暴露公网ip接口——给大模型联通知识图谱

特别鸣谢 我的领导&#xff0c;我的脑子&#xff0c;我的学习能力&#xff0c;感动了 1. 搭建知识图谱数据库&#xff08;见上一章博客&#xff09; 这里不加赘述了&#xff0c;请参考上一篇博客搭建 2. FastApi包装接口 这里注意&#xff1a;NEO4J_URI不得写http:,只能写…

AI编程新选择!VSCode + RooCode,超越Cursor​

在当今快节奏的开发环境中&#xff0c;AI编程助手已经成为提升开发效率的关键工具。然而&#xff0c;面对众多选择&#xff0c;开发者往往陷入纠结&#xff1a;如何在众多AI编程工具中找到最适合自己的方案&#xff1f;尤其是当VSCode搭配RooCode时&#xff0c;相比Cursor&…

电子病历高质量语料库构建方法与架构项目(环境聆听与自动化文档生成篇)

电子病历高质量语料库的构建是一个复杂而系统的工程,涉及数据收集、清洗、标注、验证等多个环节。在项目实施过程中,"环境聆听"和"自动化文档生成"是两个关键支撑要素,前者确保项目能够适应不断变化的技术和业务环境,后者则保障项目过程的可追溯性和知…

Python协程入门指北

一、什么是协程&#xff1f; 协程&#xff08;Coroutine&#xff09;就像可以暂停执行的函数&#xff0c;能够在执行过程中主动让出控制权&#xff0c;等准备好后再继续执行。 生活小例子 想象你在咖啡店排队&#xff1a; 普通函数&#xff1a;必须一直排到取餐&#xff08…

mysql-5.7.24-linux-glibc2.12-x86_64.tar.gz的下载安装和使用

资源获取链接&#xff1a; mysql-5.7.24-linux-glibc2.12-x86-64.tar.gz和使用说明资源-CSDN文库 详细作用 数据库服务器的核心文件&#xff1a; 这是一个压缩包&#xff0c;解压后包含 MySQL 数据库服务器的可执行文件、库文件、配置文件模板等。 它用于在 Linux 系统上安装…

C++笔记-继承(下)(包含派生类的默认成员函数,菱形继承等)

一.派生类的默认成员函数 1.14个常见默认成员函数 默认成员函数&#xff0c;默认的意思就是指我们不写&#xff0c;编译器会自动为我们生成一个&#xff0c;那么在派生类中&#xff0c;这几个成员函数是如何生成的呢&#xff1f; 1.派生类的构造函数必须调用基类的构造函数初…