递归——在运行的过程中调用自己

news2024/11/15 13:46:52

递归,就是在运行的过程中调用自己

递归必须要有三个要素:
①、边界条件
②、递归前进段
③、递归返回段
当边界条件不满足时,递归前进;当边界条件满足时,递归返回。

递归关键:写出递推公式,找到终止条件

1.求解阶乘

n! = n*(n‐1)(n‐2)…1

/**
 * 0!=1  1!=1
 * 负数没有阶乘,如果输入负数返回‐1
 * @param n
 * @return
 */
public static int Factorial(int n){
    int temp = 1;
    if(n >=0){
        for(int i = 1 ; i <= n ; i++){
            temp = temp*i;
        }
    }else{
        return ‐1;
    }
    return temp;
}

n! = n*(n‐1)!

/**
 * 0!=1  1!=1
 * 负数没有阶乘,如果输入负数返回‐1 
 * @param n
 * @return
 */
public static int Factorial(int n){
    if(n >= 0){
        if(n==0){
            System.out.println(n+"!=1");
            return 1;
        }else{
            System.out.println(n);
            int temp = n*Factorial(n‐1);
            System.out.println(n+"!="+temp);            
			return temp;
        }
    }
    return ‐1;
}

2.二分查找

注:二分查找的数组一定是有序的!!!

在有序数组array[]中,不断将数组的中间值(mid)和被查找的值比较,如果被查找的值等于array[mid],就返回下标mid;否则,就将查找范围缩小一半。如果被查找的值小于array[mid],就继续在左半边查找;如果被查找的值大于array[mid],就继续在右半边查找。直到查找到该值或者查找范围为空时,查找结束。

/**
	 * 二分查找有序数组-----循环
	 * @param arr 要查找的数组
	 * @param key 目标值
	 * @return
	 */
	public int findTwoPoint(int[] arr,int key) {
		int start = 0;
		int last = arr.length-1;
		while(last>=start) {
			int mid = (last-start)/2+start;
			if(arr[mid]==key) {
				return mid;
			}else if(arr[mid]>key) {
				last = mid-1;
			}else if(arr[mid]<key){
				start = mid+1;
			}
		}
		return -1;
	}
/**
	 * 二分查找有序数组-----递归
	 * @param arr 要查找的数组
	 * @param key 目标值
	 * @param start 数组起始位
	 * @param last 数组结束位
	 * @return
	 */
	public int search(int[] arr,int key,int start,int last) {
		int mid = (last-start)/2+start;
		 if(arr[mid]==key) {//查找值等于当前值,返回当前坐标
			 return mid;
		 }else if (start>last) {//没有找到
			 return -1;
		 } else {
			 if(key>arr[mid]) {//查找值大于当前
				 return search(arr,key,mid+1,last);
			 }else if(key<arr[mid]) {//查找值小于当前值
				 return search(arr,key,start,mid-1);
			 }
		 }
		 
		 return -1;
	}

3.汉诺塔问题

汉诺塔问题是由很多放置在三个塔座上的盘子组成的一个古老的难题。所有盘子的直径是不同的,并且盘子中央都有一个洞使得它们刚好可以放在塔座上。所有的盘子刚开始都放置在A塔座上。这个难题的目标是将所有的盘子都从塔座A移动到塔座C上,每次只可以移动一个盘子,并且任何一个盘子都不可以放置在比自己小的盘子之上。
在这里插入图片描述

所以无论有多少个盘子,我们都将其看做只有两个盘子。假设有N个盘子在塔座A上,我们将其看为两个盘子,其中(N-1)~1个盘子看成是一个盘子,最下面第N个盘子看成是一个盘子,那么解决办法为:
①、从初始塔座A上移动包含n-1个盘子到中介塔座B上。
②、将初始塔座A上剩余的一个盘子(最大的一个盘子)放到目标塔座C上。
③、将中介塔座B上n-1个盘子移动到目标塔座C上。

/**
	 * 汉诺塔问题
	 * @param dish 盘子个数
	 * @param from 初始塔座
	 * @param temp 中间塔座
	 * @param to 目标塔座
	 */
	public static void move(int dish,String from,String temp,String to) {
		if(dish==1) {
			System.out.println("将盘子"+dish+"从"+from+"移动到"+to);
		}else {
			move(dish-1,from,to,temp);
			System.out.println("将盘子"+dish+"从"+from+"移动到"+to);
			move(dish-1,temp,from,to);
		}
	}

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

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

相关文章

maven里面没有plugins dependence问题解决

说明&#xff1a;今天在做Nacos、Dubbo整合的时候&#xff0c;在父模块中做了版本限制&#xff0c;出错后就又把版本控制什么都删掉&#xff0c;回退到最开始的状态&#xff0c;此时父模块下面的服务右侧的 maven里面没有plugins dependence &#xff0c;然后项目全都报错。 问…

openSUSE安装虚拟化 qemu kvm

1) 第一种&#xff1a;图形界面yast安装虚拟化 左下角开始菜单搜索yast 点一下就能安装&#xff0c;是不是很简单呢 2&#xff09;第二种&#xff1a; 命令行安装 网上关于openSUSE安装qemu kvm的教程比较少&#xff0c;可以搜索centos7 安装qemu kvm的教程&#xff0c;然后…

/bin/bash: Resource temporarily unavailable

有现场反馈plsql无法连接数据库了&#xff0c;登录环境查看时发现从root切换到grid时报错/bin/bash: Resource temporarily unavailable [rootdb1 ~]# su - grid Last login: Thu Jul 27 18:45:04 CST 2023 su: failed to execute /bin/bash: Resource temporarily unavailab…

Ajax快速入门

Ajax Ajax就是前端访问服务器端数据的一个技术 还有主要就是异步交互 就是在不刷新整页面的情况下&#xff0c;和服务器交换部分我也数据 比如搜索的联想技术 同步和异步的概念 一个是客户端需要等待服务器完成处理&#xff0c;才能进行别的事 一个是客户端不需要等待服务器处…

剑指offer刷题笔记--Num61-68

1--扑克牌中的顺子&#xff08;61&#xff09; 主要思路&#xff1a; 五个数是顺子的充要条件&#xff1a;① 最大值 - 最小值 < 5&#xff08;大小王除外&#xff09;&#xff1b;② 没有出现重复的值&#xff08;大小王除外&#xff09;&#xff1b; 判断是否出现重复的值…

Centos虚拟机修改密码

1.重启系统 2.在这个选择界面&#xff0c;按e 3.找到如下位置&#xff0c;插入init/bin/sh 4.填写完成后按Ctrlx引导启动 5.输入mount -o remount, rw / (注意空格) 6.重置密码 出现以下为重置成功 7.执行touch /.autorelabel 8.退出exec /sbin/init 9.输入你的新密码…

linux系统编程重点复习--进程的控制

目录 1 复习目标 2 进程相关概念 2.2 并行和并发 2.3 PCB-进程控制块 2.4 进程状态(面试考) 3 创建进程 3.2 ps命令和kill命令 3.3 getpid/getppid 3.4 练习题 4 exec函数族 4.1 函数作用和函数介绍 4.1.1 execl函数 4.1.2 execlp函数 4.2 exec函数族原理介绍 4.3 …

MongDB文档--架构体系

阿丹&#xff1a; 在开始学习先了解以及目标知识的架构体系。就能事半功倍。 架构体系 MongoDB的架构体系由以下几部分组成&#xff1a; 存储结构&#xff1a;MongoDB采用文档型存储结构&#xff0c;一个数据库包含多个集合&#xff0c;一个集合包含多个文档。存储形式&#…

socket编程函数

1.socket函数 socket ()打开一个网络通讯口&#xff0c;如果成功的话&#xff0c;就像 open()一样返回一个文件插述待&#xff0c;应用程序可以像读写文件一样用 read/write 在网络上收发数据&#xff0c;如socet0调用出错则返回-1。对于 IPV4,domain 参数指定为AF_INET。对于 …

端口扫描工具

什么是端口扫描 端口扫描是使用可用的网络扫描程序协议之一&#xff08;如 SNMP 扫描&#xff09;扫描网络中的所有端口的过程。端口扫描是通过尝试连接到网络中的端口来执行的&#xff0c;其状态是根据端口扫描软件从这些端口收到的响应决定的。这使管理员能够全面了解网络中…

【计算机网络】11、网络连通性:ping、traceroute、nslookup

文章目录 一、ping1.1 禁 ping 二、traceroute三、nslookup3.1 非交互模式3.2 交互模式 注意&#xff0c;测试网络连通性时&#xff0c;有的机器无法 ping 通&#xff0c;但可能 telnet 能通。不要因为无法 ping 通就放弃尝试。 一、ping 1.1 禁 ping 禁 ping 是通过忽略 IC…

【vue】vue-image-lazy图片懒加载使用与介绍【超详细+npm包源代码】

简介 当前插件是基于vue3&#xff0c;写的一个图片懒加载&#xff0c;文章最下方是npm包的源码&#xff0c;你可以自己拿去研究和修改&#xff0c;如有更好的想法可以留言&#xff0c;如果对你有帮助&#xff0c;可以点赞收藏和关注&#xff0c;谢谢。 后续会添加图片放大和切…

如何在地图上寻找峨眉山零公里的龙洞湖

爬峨眉山的需要&#xff0c;住在零公里附近。 据说这附近有个好玩的地方叫龙洞湖&#xff0c;我们住得远&#xff0c;想步行去看看。拿出地图&#xff0c;搜龙洞湖&#xff0c;尴尬了。搜不到具体位置。细想&#xff0c;人家整个村就叫龙洞村&#xff0c;地图上居然没有标识&a…

【git技巧】什么是 .gitkeep

.gitkeep 文件的作用 就是——使 Git 保留一个空文件夹&#xff01; Git 是一个文件追踪系统&#xff0c;这也导致了 Git 的设计初衷是对文件进行追踪&#xff0c;所以&#xff0c;Git 不会追踪一个空目录。 但是&#xff0c;在某些情况下&#xff0c;我们确实是需要保留一些…

AI 绘画Stable Diffusion 研究(三)sd模型种类介绍及安装使用详解

本文使用工具&#xff0c;作者:秋葉aaaki 免责声明: 工具免费提供 无任何盈利目的 大家好&#xff0c;我是风雨无阻。 今天为大家带来的是 AI 绘画Stable Diffusion 研究&#xff08;三&#xff09;sd模型种类介绍及安装使用详解。 目前&#xff0c;AI 绘画Stable Diffusion的…

<C++> 二、类和对象(下)

1.const成员函数 将const修饰的“成员函数”称之为const成员函数&#xff0c;const修饰类成员函数&#xff0c;实际修饰该成员函数隐含的this指针&#xff0c;表明在该成员函数中不能对类的任何成员进行修改。 class A { public:void Print() //这里隐藏了A* this指针{cout &l…

【win11+vs 2017+OpenCV4.5.5+Qt5.12配置】解决了过程中遇到的小问题

0.版本选择 由于Qt5无法与最新的vs2022兼容&#xff0c;扩展工具中一直显示不可用&#xff0c;所以将vs降级成vs2017。 在安装Qt的过程中&#xff0c;会选择安装Qt套件&#xff0c;其中就的MCVS 2017&#xff0c;说明vs2017是与qt兼容的。 当然也可以用qt creator这一原生IDE。…

测试|Junit相关内容

测试|Junit相关内容 文章目录 测试|Junit相关内容0.Junit说明1.Junit注解TestDisabledBeforeAll和AfterAllBeforeEach和AfterEach 2.Junit参数化单参数多参数&#xff08;多种/多组&#xff09;CSV获取参数&#xff08;支持多种&#xff09;CSV文件获取参数&#xff08;支持多种…

牛客网Verilog刷题——VL52

牛客网Verilog刷题——VL52 题目答案 题目 请编写一个十进制计数器模块&#xff0c;当mode信号为1&#xff0c;计数器输出信号递增&#xff0c;当mode信号为0&#xff0c;计数器输出信号递减。每次到达0&#xff0c;给出指示信号zero。模块的接口信号图如下&#xff1a; 模块的…

文心一言 VS 讯飞星火 VS chatgpt (69)-- 算法导论6.5 8题

八、HEAP-DELETE(A&#xff0c;i)操作能够将结点 i 从堆 A 中删除。对于一个包含 n个元素的堆&#xff0c;请设计一个能够在 O(lgn)时间内完成的 HEAP-DELETE 操作。 文心一言&#xff1a; 要在 O(log n) 时间内完成 HEAP-DELETE 操作&#xff0c;可以使用以下方法&#xff1…