递归、搜索与回溯算法——递归

在这里插入图片描述

T04BF

👋专栏: 算法|JAVA|MySQL|C语言

🫵 小比特 大梦想

此篇文章与大家分享递归,搜索与回溯算法关于递归的专题
如果有不足的或者错误的请您指出!

目录

  • 1.什么时候使用递归
  • 2.汉诺塔
    • 2.1解析
    • 2.2题解
  • 3.合并两个有序链表
    • 3.1解析
    • 3.2题解
  • 4.翻转链表
    • 4.1解析
    • 4.2题解
  • 5.两两交换链表中的节点
    • 5.1解析
    • 5.2解析
  • 6.快速幂
    • 6.1解析
    • 6.2题解

1.什么时候使用递归

在遇到一道题的时候,如果我们发现一下几种情况,那么说明这道题可以使用递归来做
(1)这个问题可以被拆分成若干个小问题,且这些小问题和原来的主问题,有着一样的解决方法
(2)我们可以通过更小的子问题的解推出主问题的解
(3)当规模足够小的时候,可以直接求出答案

2.汉诺塔

题目:汉诺塔

2.1解析

在这里插入图片描述
如图所示,我们要将A柱的三个盘子,借助B柱,转移到C柱
那么我们的就需要分成三个大的步骤:

(1)将A柱的上面两个盘子,借助C柱,转移到B柱
(2)将A柱剩下的最大的盘子,放到C柱
(3)将B柱的两个盘子,借助A柱,转移到C柱

此时我们就能很明显的发现所谓的子问题,就是上面的(1)和(3),几个盘子,借助哪个盘子,转移到哪个盘子的问题
当我们仅有一个盘子的时候,那么直接将这个盘子移到C柱即可,即n = 1的时候,直接移动.这就是我们上面所说的,规模足够小的时候,可以直接得出答案
上面就是递归的精髓所在,我们完全可以将我们的递归函数看成 一个黑盒子,我们有理由完全相信这个黑盒子能够把我们的子问题解决,此外再找到规模足够小的时候,直接解决问题,作为递归的出口即可

2.2题解

class Solution {private void hanoi(List<Integer> pos1, List<Integer> pos2,List<Integer> pos3,int n) {if(n == 1) {pos3.add(pos1.remove(pos1.size()-1));return;}//将pos1的n-1盘子,借助C,移动到Bhanoi(pos1,pos3,pos2,n-1);//将pos1剩下的一个盘子,移动到pos3pos3.add(pos1.remove(pos1.size()-1));//将pos2的n-1个盘子,借助pos1,移动到pos3hanoi(pos2,pos1,pos3,n-1);}public void hanota(List<Integer> A, List<Integer> B, List<Integer> C) {hanoi(A,B,C,A.size());//主问题,将n个盘子,从A,借助B,移动到C}
}

3.合并两个有序链表

题目:合并两个有序链表

3.1解析

在这里插入图片描述

如图所示,如果我们要合并上述两个链表,那么就要分成3个步骤

(1)比较出两个链表头节点的大小,哪个小?记为node1
(2)将node1后面的节点形成的子链表,与另一个链表合并成有序链表,并将合并完后的头结点返回
(3)将node1的next指向(2)操作返回的头结点

此时我们就能很好的找到所谓的子问题,就是合并两个链表形成有序链表,就可以使用递归来做
那递归的出口是什么呢??
当我们其中的一条链表为空的时候,那么就直接返回第二个链表的头节点即可

3.2题解

class Solution {public ListNode mergeTwoLists(ListNode list1, ListNode list2) {if(list1 == null) {return list2;}if(list2 == null) {return list1;}ListNode newHead = null;if(list1.val > list2.val){newHead = list2;newHead.next = mergeTwoLists(list2.next,list1);}else{newHead = list1;newHead.next = mergeTwoLists(list1.next,list2);}return newHead;}
}

4.翻转链表

题目:翻转链表

4.1解析

在这里插入图片描述
如图所示,我们要将上述链表翻转,就需要分成3步
(1)将除了头结点外,其余节点组成的子链表翻转,并将翻转完后的头结点返回
在这里插入图片描述
(2)将(1)中原来的头结点的next的next指向原来的头节点
(3)将原来头结点的next指向null
在这里插入图片描述
那么此时的子问题就是:将链表除了头结点外的部分进行翻转,并返回翻转完后的头结点,就可以使用递归来做
递归的出口是什么??当只有一个节点的时候,就直接返回这个节点即可,即当head.next == null时,返回head

4.2题解

class Solution {public ListNode reverseList(ListNode head) {if(head == null || head.next == null) {return head;}ListNode newHead = reverseList(head.next);head.next.next = head;head.next = null;return newHead;}
}

5.两两交换链表中的节点

题目:两两交换链表中的节点

5.1解析

有了前两题的铺垫,这道题也是类似
在这里插入图片描述
要两两翻转链表中的节点,分为3步
(1)将第二个2个节点后的链表两两交换,返回交换完后的头结点
(2)将前两个加点交换
(3)将交换完后的节点与(1)返回的头结点连接
那么此时子问题就是 两两交换链表中的节点,就可以用递归来做
递归的出口就是:当只有一个节点或者节点为空的时候,直接返回这个节点即可

5.2解析

class Solution {public ListNode swapPairs(ListNode head) {if(head == null || head.next == null) {return head;}ListNode newHead = swapPairs(head.next.next);ListNode next = head.next;next.next = head;head.next = newHead;return next;}
}

6.快速幂

题目:快速幂

6.1解析

快速幂是一种用于快速计算x 的 n次幂的算法
假设我们现在计算的是2 ^ 32
那么快速幂的思想就是
在这里插入图片描述
此时原来通过暴力解法,需要循环32次的计算,现在只需要5次即可
那么我们将问题拆分出来,要想求2 ^ 32 ,就要先求 2^16,即要先求 2 ^ (n/2)…
那么子问题就是,求出2的 n 次方 ,就可以使用递归来做
此时当n = 0的时候,就是递归的出口
但是如果n不是偶数,是奇数怎么办??
我们只需要提出其中的一个2即可
在这里插入图片描述

6.2题解

class Solution {private double pow(double x,long n) {if(n == 0) {return 1;}double tmp = pow(x,n/2);return n % 2 == 1 ? tmp * tmp * x : tmp * tmp;}public double myPow(double x, int nn) {long n = (long)nn;//防止越界return n < 0 ? 1.0 / pow(x,-n) : pow(x,n);//处理n 是负数的问题 }
}
感谢您的访问!!期待您的关注!!!

在这里插入图片描述

T04BF

🫵 小比特 大梦想

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

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

相关文章

mysql SQL必知语法

文章目录 概要技术细节小结 概要 mysql SQL必知语法 SQL必知语法包括SELECT、FROM、WHERE、GROUP BY、HAVING、ORDER BY等关键字&#xff0c;用于查询和操作数据库中的数据。SELECT用于选择需要查询的列&#xff0c;FROM用于指定数据表&#xff0c;WHERE用于设置查询条件&…

下载软件时的Ubuntu x86_64-v2、skylake、aarch64版本分别代表什么?

Ubuntu-x86_64-v2、Ubuntu-x86_64-skylake和Ubuntu-aarch64都是Ubuntu的不同版本或变种&#xff0c;它们之间的主要区别在于所支持的硬件架构和针对特定硬件的优化。 Ubuntu-x86_64-v2&#xff1a; 这是基于x86_64&#xff08;也称为AMD64或Intel 64&#xff09;架构的Ubuntu版…

Ubuntu上根据关键字模糊查找指定文件夹或文件

在Ubuntu上根据关键字模糊查找指定文件夹或文件&#xff0c;可以使用以下方法&#xff1a; GNOME 桌面搜索&#xff1a; 使用GNOME桌面的Spotlight式搜索功能&#xff0c;通过按下Super键&#xff08;通常是Windows键&#xff09;并输入关键字&#xff0c;可以搜索文件和文件夹…

人类连接的桥梁:探索Facebook如何连接世界

随着技术的发展和全球化的进程&#xff0c;我们的世界正在变得越来越紧密相连。在这个过程中&#xff0c;社交媒体平台扮演了一个至关重要的角色&#xff0c;为人们提供了一个跨越国界、文化和语言的交流平台。其中&#xff0c;Facebook作为全球最大的社交媒体平台&#xff0c;…

rancher踩坑日志:prometheus访问kubelet 10250端口提示鉴权失败

该原因是因为kubectl禁止了非授权用户访问10250端口来获取node的数据。 解决思路&#xff1a; 添加prometheus访问kubelet时带上证书进行验证匹配 --> 由于我的prometheus是rancher安装的&#xff0c;不知道要怎么修改所以研究了一会没研究明白就放弃了。设置prometheus访问…

Rockchip Android13 Vold(二):Framework层

目录 前言 1、接收VolumeInfo状态 2、通知VolumeInfo状态变化 3、创建StorageVolume

Create2024百度AI开发者大会记录

去年2023.3.16日百度文心大模型发布&#xff0c;今天2024.4.16日 代码智能体&#xff1a;思考模型代码解释器 思考模型整合提示&#xff0c;输入给代码解释器 代码解释器出结果&#xff0c;返回给思考模型&#xff0c;然后迭代 智能代码助手 baidu Comate 多模型推理 种子模型…

JavaScript入门--循环

JavaScript入门--循环 一、for循环二、for in语句三、break语句四、continue语句五、while循环六、do-while语句一、for循环 先来看一个循环案例: for (i = 0; i < 5; i++) {

如何批量删除不包含指定关键字的数据行?

一、需求 有一个报名表&#xff0c;包括年龄&#xff0c;地址&#xff0c;特长等数据&#xff0c;现在想删除特长一列中不含“篮球”这个关键字行&#xff0c;可以使用这些办法。 二、删除数据 方法1.自动筛选&#xff0c; 1.1 选中数据后&#xff0c;点击数据选项卡&#…

java 中公有类的产量如何定义

在Java编程语言中,“公有类”和“产量”的概念并不直接相关联。 “公有类”(public class)是指在Java中,可以被任何其他类访问的类。如果你想要定义一个公有类,你将在类声明处使用 public 关键字: // 这是一个公有类的例子 public class MyClass {// 类体部分,包含字段…

微信人脉扩张!多号批量自动加好友,你get到了吗?

微信是我们在拓展社交圈和寻找商业机会时&#xff0c;与更多的人建立联系的重要渠道。但是&#xff0c;手动一个个添加好友显然费时费力&#xff0c;这时候&#xff0c;微信管理系统的批量自动加好友功能就成为了微信人脉扩张的神器。 通过微信管理系统&#xff0c;我们可以轻…

Java中如何提取视频文件的缩略图

在Java中&#xff0c;可以使用FFmpeg库来提取视频文件的缩略图。以下是一种使用FFmpeg的方法来提取视频缩略图的示例代码&#xff1a; import java.io.File; import java.io.IOException;public class VideoThumbnailExtractor {public static void main(String[] args) {Stri…

IO流-打印流

简介 为打印而生的IO流 打印流的继承体系 优点 高效方便打印的是啥就是啥&#xff0c;不会瞎转&#xff08;不会把97转成a&#xff09; PrintStream try(PrintStream ps new PrintStream("test7.txt", "UTF-8"); ){ps.println(97); // 打印流的优点就是原…

三个晚上!给干废了!MINI2440 挂载 NFS

虚拟机执行&#xff1a;sudo ifconfig tap0 10.10.10.1 up qemu 开发板&#xff1a; set bootargs noinitrd root/dev/nfs rw nfsroot10.10.10.1:/nfsroot ip10.10.10.10:10.10.10.1 ::255.255.255.0 consolettySAC0,115200 Hit any key to stop autoboot: 0 MINI2440 # set…

mybatisplus 使用group by 和 count 报 java.lang.NumberFormatException

报错信息&#xff1a; java.lang.NumberFormatException: For input string: "Critical" at java.base/java.lang.NumberFormatException.forInputString(NumberFormatException.java:67) ~[na:na] resultMap如下&#xff1a; <resultMap id"severityNumRes…

前后端分离vue.js+nodejs新闻文章发布论坛网站系统44x94

Vue&#xff1a; Vue是一套用于构建用户界面的渐进式框架。与其它大型框架不同的是&#xff0c;Vue 被设计为可以自底向上逐层应用。Vue 的核心库只关注视图层&#xff0c;不仅易于上手&#xff0c;还便于与第三方库或既有项目整合。另一方面&#xff0c;当与现代化的工具链以及…

​代码混淆的原理是什么?常见代码混淆方法介绍

本文主要想你介绍代码混淆的原理&#xff0c;常见代码混淆方法&#xff0c;欢迎查阅~ 移动应用代码安全非常重要&#xff0c;代码逆向会导致代码逻辑被获取&#xff0c;进一步导致控制流被hook&#xff0c;安全防线被破&#xff0c;给APP安全带来巨大风险&#xff0c;因此开发者…

跟着Datawhale重学数据结构与算法

数据结构和算法之前学过&#xff0c;现在跟着Datawhale重学一下&#xff0c;就当是监督自己学习&#xff0c;重新拾起来养成一个好的习惯&#xff0c;以后可以一直坚持下去。 开源链接&#xff1a;【 教程地址 】【电子网站】 首先&#xff1a; #mermaid-svg-Cdr3rn9fGCVAiKS…

Redis消息队列-基于Stream的消息队列-消费者组

7.5 Redis消息队列-基于Stream的消息队列-消费者组 消费者组&#xff08;Consumer Group&#xff09;&#xff1a;将多个消费者划分到一个组中&#xff0c;监听同一个队列。具备下列特点&#xff1a; 创建消费者组&#xff1a; key&#xff1a;队列名称 groupName&#xff1a…

安装SSMS出现错误和SSMS连接数据库失败

1.点击图片下安装的时候&#xff0c;出现0x80070643错误 解决办法&#xff1a; 1,如果是是第一次安装的话&#xff0c;重新启动电脑&#xff0c;把原来下载的SSMS删除掉&#xff0c;在重新下载安装 2.如果是原来就下载过&#xff0c;先…