递归算法(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:斐波那契数列的实现,树的遍历,快速排序) 的相关文章

随机推荐

  • 一天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循环可以通过栈 实