递归算法:代码迷宫中的无限探索

✨✨✨学习的道路很枯燥,希望我们能并肩走下来!

目录

前言

一 深入理解递归

二 迭代VS递归

三 递归算法题目解析

3.1 汉诺塔问题

 3.2 合并两个有序链表

3.3 反转链表 

3.4 两两交换链表中的节点 

3.5 Pow(x,n)(快速幂) 

​四 总结

总结


前言

作为递归、搜索与回溯算法系列的第一篇,本篇详细介绍了递归算法的使用,让使用者了解递归运算,而不是仅仅停留在表面, 文章可能出现错误,如有请在评论区指正,让我们一起交流,共同进步!


一 深入理解递归

二 迭代VS递归

三 递归算法题目解析

3.1 汉诺塔问题

面试题 08.06. 汉诺塔问题 - 力扣(LeetCode)

 

我们简单取1到4个圆盘进行移动,我们从宏观角度发现这是一个重复子问题

class Solution {
public:void move(vector<int>& A, vector<int>& B, vector<int>& C,int n){if(n == 1){C.push_back(A.back());A.pop_back();return;}move(A,C,B,n-1);C.push_back(A.back());A.pop_back();move(B,A,C,n-1);}void hanota(vector<int>& A, vector<int>& B, vector<int>& C) {int n = A.size();move(A,B,C,n);}
};

 如果我们在笔试中遇到的,只需要保证能通过就行

不讲武德版:

class Solution {
public:void hanota(vector<int>& A, vector<int>& B, vector<int>& C) {C = A;}
};

 3.2 合并两个有序链表

21. 合并两个有序链表 - 力扣(LeetCode)

 我们之前是使用迭代(循环)来做的

迭代:

/*** Definition for singly-linked list.* struct ListNode {*     int val;*     struct ListNode *next;* };*/
typedef struct ListNode ListNode;
struct ListNode* mergeTwoLists(struct ListNode* list1, struct ListNode* list2) 
{ListNode* l1 = list1;ListNode* l2 = list2;ListNode* newHead = NULL;ListNode* newTail = NULL;newHead = newTail = (ListNode*)malloc(sizeof(ListNode));if(l1==NULL){return l2;}if(l2==NULL){return l1;}while(l1&&l2){if(l1->val<l2->val){newTail->next=l1;newTail=newTail->next;l1=l1->next;}else{newTail->next=l2;newTail=newTail->next;l2=l2->next;}}if(l1){newTail->next=l1;}else{newTail->next=l2;}ListNode* ret = newHead->next;free(newHead);return ret;
}

递归:

/*** Definition for singly-linked list.* struct ListNode {*     int val;*     ListNode *next;*     ListNode() : val(0), next(nullptr) {}*     ListNode(int x) : val(x), next(nullptr) {}*     ListNode(int x, ListNode *next) : val(x), next(next) {}* };*/
class Solution {
public:ListNode* mergeTwoLists(ListNode* list1, ListNode* list2) {if(list1 == nullptr)    return list2;if(list2 == nullptr)    return list1;if(list1->val <= list2->val){list1->next = mergeTwoLists(list1->next,list2);return list1;}else{list2->next = mergeTwoLists(list1,list2->next);return list2;}}
};

3.3 反转链表 

206. 反转链表 - 力扣(LeetCode)

 

/*** Definition for singly-linked list.* struct ListNode {*     int val;*     ListNode *next;*     ListNode() : val(0), next(nullptr) {}*     ListNode(int x) : val(x), next(nullptr) {}*     ListNode(int x, ListNode *next) : val(x), next(next) {}* };*/
class Solution {
public:ListNode* reverseList(ListNode* head) {if(head == nullptr ||head->next == nullptr) return head;ListNode* newNode = reverseList(head->next);head->next->next = head;head->next = nullptr;return newNode;}
};

3.4 两两交换链表中的节点 

24. 两两交换链表中的节点 - 力扣(LeetCode)

 

/*** Definition for singly-linked list.* struct ListNode {*     int val;*     ListNode *next;*     ListNode() : val(0), next(nullptr) {}*     ListNode(int x) : val(x), next(nullptr) {}*     ListNode(int x, ListNode *next) : val(x), next(next) {}* };*/
class Solution {
public:ListNode* swapPairs(ListNode* head) {if(head == nullptr || head->next == nullptr)    return head;auto newNode = swapPairs(head->next->next);auto ret = head->next;head->next->next = head;head->next = newNode;return ret;}
};

3.5 Pow(x,n)(快速幂) 

50. Pow(x, n) - 力扣(LeetCode)

 

class Solution {
public:double myPow(double x, int n) {return n<0 ? 1.0/Pow(x,-(long long)n) : Pow(x,n);}double Pow(double x, long long n) {if(n == 0)  return 1.0;double tmp = Pow(x,n/2);return n%2 == 0 ? tmp*tmp : tmp*tmp*x;}
};

 用long long避免int无法存n为2的-31次方

 四 总结

        1.  从题目发掘出重复的子问题

        2.  只针对某一子问题考虑解决方法

        3. 注意递归出口


总结

✨✨✨各位读友,本篇分享到内容是否更好的让你理解递归算法,如果对你有帮助给个👍赞鼓励一下吧!!
🎉🎉🎉世上没有绝望的处境,只有对处境绝望的人。
感谢每一位一起走到这的伙伴,我们可以一起交流进步!!!一起加油吧!!

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

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

相关文章

OS复习笔记ch11-1

外围设备的管理和磁盘调度 外围设备 从CPU的角度来看&#xff0c;外设有几个比较重要的I/O接口&#xff08;interfaces&#xff09; 状态reg&#xff1a;向CPU报告设备的状态&#xff08;忙碌/空闲&#xff09;命令reg&#xff1a;接收CPU命令&#xff0c;存储 CPU 需要执行的…

SwiftUI 6.0(iOS/iPadOS 18)中全新的 Tab 以及 Sidebar+悬浮 TabView 样式

概览 看来苹果一直对 iPadOS 中标签栏&#xff08;TabView&#xff09;不甚满意。这不&#xff0c;在 WWDC 2024 中苹果又对 TabView 外观做了大幅度的进化。 现在我们可以在顶部悬浮条和左侧的 Sidebar 两种不同布局之间恣意切换 TabView 的外观啦。而且&#xff0c;这在 Swi…

用AI帮助设计师提升工作效率?

在创意设计的世界里&#xff0c;效率往往意味着灵感与时间的完美结合。设计师们时常面临各种挑战&#xff0c;如何在保证作品质量的同时&#xff0c;又能提升工作效率&#xff1f;这不仅是设计师们思考的问题&#xff0c;也是AI技术正在积极解决的问题。那么&#xff0c;用AI帮…

华为仓颉开发语言“可能”明天正式面世(2024年6月20日写下)

众多迹象表明&#xff0c;鸽了几次的华为仓颉开发语言&#xff0c;有望在2024华为开发者大会上正式面世&#xff0c;你的期待热情是否还在&#xff1f; 1、“仓颉编程语言”公众号面世 最近&#xff0c;华为旗下的公众号“编程语言Lab”悄然改名为“仓颉编程语言”&#xff0c…

MySQL中实现行列转换的示例

在 MySQL 中进行行列转换&#xff08;即&#xff0c;将某些列转换为行或将某些行转换为列&#xff09;通常涉及使用条件逻辑和聚合函数。虽然 MySQL 没有像 Oracle/SQL Server 中的 PIVOT 和 UNPIVOT 那样的直接功能&#xff0c;但你可以通过结合 CASE 语句、UNION 或 UNION AL…

汽车信息安全硬件讨论:SE vs HSM

目录 1.什么是Secure Element 2.芯片内置HSM和SE 3.未来HSM的发展 现在的智能网联汽车看起来像是一个连接万物的智能移动终端&#xff0c;它不仅可以与OEM云服务器通信接收OTA推送&#xff0c;还可以与手机蓝牙、Wifi交互完成远程汽车解锁、座舱内环境设置等等&#xff0c;借…

echarts dataZoom用按钮代替鼠标滚轮实现同样效果

2024.06.19今天我学习了echarts dataZoom如何用按钮来控制放大缩小的功能&#xff0c; 效果如下&#xff1a; 通过控制按钮来实现图表放大缩小数据的效果。 步骤如下&#xff1a; 一、写缩放按钮&#xff0c;以及图表数据。 二、设置初始位置的变量&#xff0c;我这边是七个…

爬虫学习。。。。

爬虫的概念&#xff1a; 爬虫是一种自动化信息采集程序或脚本&#xff0c;用于从互联网上抓取信息。 它通过模拟浏览器请求站点的行为&#xff0c;获取资源后分析并提取有用数据&#xff0c;这些数据可以是HTML代码、JSON数据或二进制数据&#xff08;如图片、视频&#xff09…

【类型转换】C++中char、char*、int、string相互转换函数及string转不同进制数函数

参考资料&#xff1a;cplusplus官方资料strtol 函数用法 总结&#xff1a; 1、这些在做编程题处理输入数据时常用&#xff0c;需要牢记。

打造智能家居:用ESP32轻松实现无线控制与环境监测

ESP32是一款集成了Wi-Fi和蓝牙功能的微控制器&#xff0c;广泛应用于物联网项目。它由Espressif Systems公司开发&#xff0c;具有强大的处理能力和丰富的外设接口。下面我们将详细介绍ESP32的基础功能和引脚功能&#xff0c;并通过具体的实例项目展示其应用。 主要功能 双核处…

XSS+CSRF组合拳

目录 简介 如何进行实战 进入后台创建一个新用户进行接口分析 构造注入代码 寻找XSS漏洞并注入 小结 简介 &#xff08;案例中将使用cms靶场来进行演示&#xff09; 在实战中CSRF利用条件十分苛刻&#xff0c;因为我们需要让受害者点击我们的恶意请求不是一件容易的事情…

商业银行数据资产管理体系建设的实践与展望

随着数字经济的快速发展&#xff0c;数据已成为商业银行的核心资产。商业银行在数字化转型过程中&#xff0c;面临如何有效管理和利用海量数据资产的挑战。本文基于《商业银行数据资产管理体系建设实践报告》&#xff0c;探讨浦发银行、IBM和中国信息通信研究院在数据资产管理体…

DVWA - Brute Force

DVWA - Brute Force 等级&#xff1a;low ​ 直接上bp弱口令爆破&#xff0c;设置变量&#xff0c;攻击类型最后一个&#xff0c;payload为用户名、密码简单列表 ​ 直接run&#xff0c;长度排序下&#xff0c;不一样的就是正确的用户名和密码 ​ 另解&#xff1a; 看一下…

NSSCTF-Web题目8

目录 [LitCTF 2023]Http pro max plus 1、题目 2、知识点 3、思路 [NSSCTF 2022 Spring Recruit]babyphp 1、题目 2、知识点 3、思路 [LitCTF 2023]Http pro max plus 1、题目 2、知识点 http数据包头部字段 3、思路 打开题目 第一想法就是加上X-forwarded-for字段 …

一分钟搭建新生录取查询系统

小伙伴们&#xff0c;新学期就要开始了&#xff0c;招生老师们&#xff0c;你们准备好迎接新生了吗&#xff1f;我给老师们分享一个超级实用的小技巧——如何用快速搭建一个新生录取查询系统&#xff01; 准备好录取名单的电子表格&#xff0c;记得包含“姓名”和“手机号”这样…

可视化大屏:选了浅色系,结果悲剧了

某些时候&#xff0c;有些客户不听劝告&#xff0c;感觉深色系大屏过于压抑&#xff0c;就让用浅色系&#xff0c;结果浅色系投到大屏上&#xff0c;直接亮瞎了。 选择浅色系的可视化大屏可能会存在以下几个问题&#xff1a; 视觉疲劳&#xff1a; 浅色系的颜色相对较亮&…

极限编程里最容易被忽略的实践

在前面的一篇文章里面我和大家聊过了极限编程的重要性&#xff0c;今天想和大家聊聊极限编程里面最简单但也往往最容易被忽略的实践——编码规范。 说到编码规范&#xff0c;每一个开发人员都非常熟悉&#xff0c;每一个团队也都有自己的编码规范。但实际的执行情况如何呢&…

深圳信用贷款之路:申请了10次都被拒!这三步帮你逆袭银行贷款!

贷款客户最头疼的就是明明查询了一堆资料&#xff0c;贷款还是办不下来&#xff01;尤其是那些负债累累的&#xff0c;急需资金还月供和本金的朋友们&#xff0c;不是在贷款就是在贷款的路上&#xff0c;一个月申请了10次都被拒&#xff01;去了好几家贷款机构&#xff0c;费用…

数据库开发-MySQL

前言 首先来了解一下什么是数据库。 数据库&#xff1a;英文为 DataBase&#xff0c;简称DB&#xff0c;它是存储和管理数据的仓库。 像我们日常访问的电商网站京东&#xff0c;企业内部的管理系统OA、ERP、CRM这类的系统&#xff0c;以及大家每天都会刷的头条、抖音类的app…

文字游侠:一款全新AI写作模型,每天10分钟一键创作爆文!附渠道和玩法教程!

在当今快节奏的社会中&#xff0c;虽然传统的工作可以满足我们基本的物质需求&#xff0c;但许多人内心深处渴望的是更高层次的精神满足。这就像是我们常说的&#xff1a;“工资可以喂饱肚子&#xff0c;副业可以养活灵魂。”这并不是鼓励大家辞去日常工作&#xff0c;而是提倡…