递归算法(demo:斐波那契数列的实现,树的遍历,快速排序)

2023-11-17

递归算法:执行代码,并没执行完全的时候调用自己本身,然后等待条件不满足递归的时候,完全执行代码,执行完全后返回上一层,执行未完成的部分;

递归算法与for,where循环可以相互转换,通过一定的方案达到一样的效果,比如for循环可以通过栈,实现递归的效果;

递归算法一般用于树的节点的遍历等...

递归算法的重点:参数的设置;

 

demo:斐波那契数列的实现

for循环方式实现:

//1,1,2,3,5,8,13,...
int num1=1;
int num2=1;
int num3=0;
int n=10;//表示斐波那契数列的第十项
for(int i=2;i<n;i++){
   num3=num1+num2;
   num2=num3;
   num1=num2;
}
//后一项等于前两项相加

递归实现方式:

main方法
{
   //调用
}

static int run(int n){

  if(n==1||n==2){

    return 1;

  }else{
    
    return run(n-1)+run(n-2);

  }

}

该demo中,递归时间消耗远大于循环;(递归性能低)

---------------------------------------------------------------------------------------------------------------------------------------------------------------

demo2:树的遍历(文件夹遍历)-----真实场景中:文件夹的剪切(Java不提供文件夹的剪切方法,需要自己代码实现)

main(){//主方法

   play(new File("D:\\ceshi"));

}

static void play(File file){

   //获取当前文件夹下的所有文件夹、文件
   File[] files=file.listFiles();

   for(int i=0;i<files.length;i++){
      
     if(files[i].isFile()){//是文件

        System.out.println(files[i].getName());        

     }else{//是文件夹

        play(files[i]);

     }

   }

}

类似于树状的结构,使用递归效率较高;

如上述demo中的文件夹的遍历,又比如,快速排序算法的实现:

demo3:快速排序的实现

package zmc.text;

public class paixu {

	public static void main(String[] args) {

		int arr[]={5,6,3,8,4,9,5,1,2,8};
		sortFinally(arr,0,arr.length-1);
	}
	
	public static void sortFinally(int[] arr,int lo,int hi){
		if(lo<hi){
			int middle=sort(arr,lo,hi);
			sortFinally(arr,lo,middle-1);//左边
			sortFinally(arr,middle+1,hi);//右边
		}

	}
	
	public static int sort(int[] arr,int lo,int hi){
		//找到一个标识:一般为数组的第一个值
		int key=arr[lo];
		//对一个数组进行循环遍历,i从左往右,j从右往左
		//j先走,与key进行比较,比key小则赋值给i(对应的值)
		//j赋值完就不动了,i开始走,遇到比key大的,停止,赋值给j对应的数字
		//...
		int i=lo;//开始位置
		int j=hi;//结束位置
		while(i<j){
			while(i<j){
				if(arr[j]<key){//j找小于key的值给i
					arr[i]=arr[j];
					break;
				}
				j--;
			}
			
			while(i<j){
				if(arr[i]>=key){//i找大于key的值给j
					arr[j]=arr[i];
					break;
				}
				i++;
			}
		}
		//当i,j相遇,key的值赋值给那个位置的数
		arr[i]=key;
		return i;
	}

}

 

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

递归算法(demo:斐波那契数列的实现,树的遍历,快速排序) 的相关文章

  • Mongo 可审核的 ZonedDateTime 字段在 Spring Boot 2 中不起作用

    在 Spring Boot 项目中 我使用 CreatedDate 之类的注释来保存有关创建 更新相应文档的日期的信息 整个项目都使用 ZonedDateTime 因此带注释的字段也是 ZonedDateTime 为了实现 Mongo 的日
  • Java 字符串哈希码缓存

    字符串不变性的优点之一是哈希码缓存以实现更快的访问 在这种情况下 如何处理具有相同哈希码的字符串的缓存 在这种情况下它真的能提高性能吗 在这种情况下 如何处理具有相同哈希码的字符串的缓存 被缓存的是字符串的哈希码 它被缓存在私有的int字符
  • Java中RandomAccessFile的并发

    我正在创建一个RandomAccessFile对象通过多个线程写入文件 在 SSD 上 每个线程都尝试在文件中的特定位置写入直接字节缓冲区 并且我确保线程写入的位置不会与另一个线程重叠 file getChannel write buffe
  • 如何使用retrofit2动态设置超时?

    public class Router private static Retrofit retrofit null public Retrofit getRetrofit if retrofit null OkHttpClient clie
  • 使用正则表达式验证输入字符串是否为 0-255 之间的数字

    我在将输入字符串与正则表达式匹配时遇到问题 我想验证输入数字在 0 255 之间并且长度最多应为 3 个字符 代码工作正常 但当我输入 000000 至任意长度时 显示 true 而不是 false 这是我的代码 String IP 000
  • Java 流 - 按嵌套列表分组(按第二顺序列出)

    我有以下数据结构 每个学生都有一个州列表 每个州都有一个城市列表 public class Student private int id private String name private List
  • Active MQ - HelloWorld 示例异常

    我正在尝试运行 hello world 示例在这里找到 http activemq apache org hello world html I added activemq all 5 5 1 jar已经到图书馆了 它构建成功 但出现以下警
  • EL 通过 Scriptlet

    在 JSP 中使用 EL 相对于 scriptlet 的优势是什么 EL 被认为是无脚本语言 EL 使 JSP 免受容易出错原始 Java 代码并强制您根据 MVC 思想编写 JSP EL 或像 JSTL 这样的标签库 不可能实现的任何事情
  • 从字符串生成密钥?

    我需要从字符串生成一个密钥 以便我始终可以从同一字符串创建相同的密钥 具体来说是一个Key对象 这样我就可以用它来创建Cipher进而创建SealedObject 这在 Java 中可行吗 我应该考虑什么类 方法组合才能做到这一点 对于 A
  • Android 游戏偶尔出现延迟

    我正在用 Java 制作一个简单的 Android 游戏 我注意到每 20 40 秒就会出现一些烦人的延迟 首先 我认为它们是由垃圾收集器引起的 但当我检查 LogCat 时 我发现游戏滞后时没有垃圾收集 每当游戏开始滞后时 我都会标记日志
  • 我需要一个字数统计程序[关闭]

    这个问题不太可能对任何未来的访客有帮助 它只与一个较小的地理区域 一个特定的时间点或一个非常狭窄的情况相关 通常不适用于全世界的互联网受众 为了帮助使这个问题更广泛地适用 访问帮助中心 help reopen questions 我需要弄清
  • 在java中将DataURL图像转换为图像文件

    我在我的 java servlet 中接收图像 DataURL 它看起来像 data image jpeg base64 9j 4AAQSkZJRgABAQAAAQABAA 我需要将其另存为图像文件 我该怎么做 The simplest w
  • 如何使用 Selenium 中的索引切换到窗口

    由于selenium不提供切换到窗口 多个窗口 的方法 但我想使用index html自定义方法来切换到不同的窗口 但下面的代码没有按预期工作 请建议以下方法的最佳实施 public void switchToWindowIndex int
  • 使用 JNI 从 Java 代码中检索 String 值的内存泄漏

    我使用 GetStringUTFChars 从使用 JNI 的 java 代码中检索字符串的值 并使用 ReleaseStringUTFChars 释放该字符串 当代码在 JRE 1 4 上运行时 不会出现内存泄漏 但如果相同的代码在 JR
  • java中日期转换dd-MMM-yyyy到dd-MM-yyyy

    在Java中将23 Mar 2011转换为23 03 2011的最简单方法是什么 感谢大家 这似乎解决了这个问题 try Calendar cal Calendar getInstance cal setTime new SimpleDat
  • 使用 Box2d(适用于 Android)进行碰撞检测?

    有人可以解释一下使用 box2d for android 进行碰撞检测的工作原理吗 我无法理解 BBContactListener 以什么方式工作 BBContactListener listener new BBContactListen
  • JFrame Glasspane 也优于 JDialog,但不应该

    我有一个带有 Glasspane 的 JFrame 未装饰 该框架打开一个 JDialog 也未装饰 也有一个 glassPane 并隐藏自身 setVisible false Glasspanes 通过 setGlassPane 设置 对
  • 构造函数参数和属性一起出现在 bean 定义中

  • 如何列出Resources文件夹中的所有文件(java/scala)

    我正在编写一个函数 需要访问资源中的文件夹 并循环遍历所有文件名 如果这些文件符合条件 则加载这些文件 new File getClass getResource images sprites getPath listFiles 返回空指针
  • Retrofit 2.0:预期为 BEGIN_OBJECT,但在第 1 行第 1 列路径 $ [重复] 处为 STRING

    这个问题在这里已经有答案了 我在邮递员上传递了更新用户请求并获得了成功的响应 参见图片 现在当我尝试使用 Retrofit 2 在我的应用程序中执行相同操作时 出现错误 com google gson JsonSyntaxException

随机推荐

  • 一天1个机器学习知识点(一)

    陆陆续续整理的机器学习的知识点 资料大多数来自网上 不做盈利目的 如果侵权请告知即删 如果文章中有错误的地方还请各位同学指正 一起学习 一起进步 每天都在更新中 记得收藏 每天进步一点点 一天1个机器学习知识点 一 决策树 有无监督学习 S
  • ajax中的application/x-www-form-urlencoded中的使用

    一 HTTP上传的基本知识 在Form元素的语法中 EncType表明提交数据的格式 用 Enctype 属性指定将数据回发到服务器时浏览器使用的编码类型 下边是说明 application x www form urlencoded 窗体
  • MSP430 F5529的按钮控制led灯亮灭程序代码——按一下亮一下,再按一下暗

    2019 6 27 MP430F5529 电子工艺实习实验1 作业1 按下按键 LED亮 再按一次 LED灭 设置P8 1输出灯 P1 2输入按钮 P1 2下降沿 1 0 中断 中断标识为0 给按钮设置上拉电阻让其的高电位更加稳定 设置这两
  • 详解Java基础中注释添加的位置以及原则

    一 添加注释的位置 1 类 接口 这一部分注释是必须的 在这里 我们需要使用javadoc注释 需要标明 创建者 创建时间 版本 以及该类的作用 2 方法 在方法中 我们需要对入参 出参 以及返回值 均要标明 3 常量 对常量 我们需要使用
  • error LNK2005: _DllMain@12 already defined in MSVCRTD.lib

    本文主要分析和解决编译链接时产生的 LNK2005 错误 错误信息 mfcs90ud lib dllmodul obj error LNK2005 DllMain 12 already defined in MSVCRTD lib dllm
  • System.currentTimeMillis()

    System currentTimeMillis 计算方式与时间的单位转换 一 时间的单位转换 1秒 1000毫秒 ms 1毫秒 1 1 000秒 s 1秒 1 000 000 微秒 s 1微秒 1 1 000 000秒 s 1秒 1 00
  • Nginx 解决跨域

    项目准备 前端网站地址 http localhost 8080 服务端网址 http localhost 8081 确认服务端是没有处理跨域的 先用postman测试服务端接口是正常的 当前端网站8080去访问服务端接口时 就产生了跨域问题
  • 华硕笔记本开机自动进入bios,进不了windows系统的解决方法

    亲测有效解决办法 1 开机的时候长按F2键进入BIOS界面 通过方向键进 Secure 菜单 通过方向键选择 Secure Boot Control 选项 将其设定为 Disabled 2 通过方向键进入 Boot 菜单 通过方向键选择 L
  • ROS2执行source setup.bash命令报错及解决办法

    1 错误类型 在对ros2包编译通过后 在终端执行 source path to your workspace install setup bash 时报错 not found path to your workspace install
  • 快手直播怎么引流?快手直播效果怎么样?每个人对时尚的定义不同

    快手直播怎么引流 快手直播效果怎么样 每个人对时尚的定义不同 快手直播效果怎么样 每个人对时尚的定义不同 对于普通人来说 都会有对美的追求 比如找到适合自己的穿搭 适合自己的美妆 几乎每一种时尚风格在快手平台都能有被老铁认可的机会和其存在的
  • mysql常用的hint(原创)

    转自 http linux chinaunix net techdoc database 2008 07 29 1021449 shtml 对于经常使用Oracle的朋友可能知道 oracle的hint功能种类很多 对于优化sql语句提供了
  • 网络部署运维实验(pat 端口映射含命令)

    作者 小刘在这里 每天分享云计算网络运维课堂笔记 疫情之下 你我素未谋面 但你一定要平平安安 一 起努力 共赴美好人生 夕阳下 是最美的 绽放 愿所有的美好 再疫情结束后如约而至 目录 一 实验简介 二 图纸 三 实验命令 一 实验简介 本
  • 区块链开发团队,公链开发才是主战场

    在区块链技术开发公司不断完善的当下 很多企业都想加入进来 有远见的人永远能嗅到区块链未来市场的发展趋向 以区块链技术开发实体企业应用 在空白的市场里拥有无限开发潜力 而创业者要做的就是快人一步 才能夺得市场先机 我们团队作为一家专业的区块链
  • python统计字符串中,字母的个数、数字的个数、其它字符个数。

    str input 请输入 letter 0 num 0 other 0 for i in str if i isdigit num 1 elif i isalnum letter 1 else other 1 print letter n
  • axios post传递对象_POST 方法的content-type类型

    content type是http请求的响应头和请求头的字段 当作为响应头时 告诉客户端实际返回的内容的内容类型 作为请求头时 post或者put 客户端告诉服务器实际发送的数据类型 在前端开发过程中 通常需要跟后端工程师对接接口的数据格式
  • React 条件渲染最佳实践(7 种方法)

    在 React 中 条件渲染可以通过多种方式 不同的使用方式场景取决于不同的上下文 在本文中 我们将讨论所有可用于为 React 中的条件渲染编写更好的代码的方法 条件渲染在每种编程语言 包括 javascript 中都是的常见功能 在 j
  • 线性dp的题目汇总

    恩 挺多 慢慢看 衔接在此
  • ccrypt 在 Windows上的使用教程

    ccrypt是个加密解密工具包 一般情况下在Linux上使用 这是个windows版的使用教程 请注意 ccrypt是一个 命令行 程序 它只能从DOS提示符或shell中运行 它不是那种双击就能运行的程序 step1 到官网下载对应的安装
  • gvim for verilog简易配置

    目录 前言 一 gvim的主题和字体资源 二 gvim编辑器基本配置 三 gvim针对verilog配置 总结 前言 分别介绍了gvim的主题和字体资源推荐 gvim编辑器基本配置和针对verilog的配置 以下为正文 一 gvim的主题和
  • 递归算法(demo:斐波那契数列的实现,树的遍历,快速排序)

    递归算法 执行代码 并没执行完全的时候调用自己本身 然后等待条件不满足递归的时候 完全执行代码 执行完全后返回上一层 执行未完成的部分 递归算法与for where循环可以相互转换 通过一定的方案达到一样的效果 比如for循环可以通过栈 实