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

news2024/10/25 16:18:30

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

目录

前言

一 深入理解递归

二 迭代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.coloradmin.cn/o/1842449.html

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

相关文章

DAC测试实验——FPGA学习笔记7

一、DAC简介 DAC全称Digital to Analog Converter&#xff0c;即数模转换器。它用于将主控芯片产生的数字值(0和1)转换为模拟值(电压值)。 1、DAC参数指标 2、DAC类型 常用的DAC可大致分为权电阻网络DAC、T型电阻网络DAC、倒T型电阻网络DAC以及权电流型DAC。 3、AD9708/3PD9…

【stm32-新建工程-寄存器版本】

stm32-新建工程-寄存器版本 ■ 下载相关STM32Cube官方固件包&#xff08;F1&#xff0c;F4&#xff0c;F7&#xff0c;H7&#xff09;■ 1. ST官方搜索STM32Cube■ 2. 搜索 STM32Cube■ 3. 点击获取软件■ 4. 选择对应的版本下载■ 5. 输入账号信息■ 6. 出现下载弹框&#xff…

智能座舱中的HUD介绍

HUD&#xff08;Head Up Display&#xff0c;抬头显示系统&#xff09;是将车速、油耗、胎压等行车重要信息投影到前方挡风玻璃上的一套显示系统。HUD 最早应用在战斗机上&#xff0c;旨在降低飞行员低头查看仪表的频率&#xff0c;使得飞行员能在保证正常驾驶的同时&#xff0…

# 消息中间件 RocketMQ 高级功能和源码分析(七)

消息中间件 RocketMQ 高级功能和源码分析&#xff08;七&#xff09; 一、 消息中间件 RocketMQ 源码分析&#xff1a;消息存储核心类介绍 1、消息存储在 store 模块中。消息存储核心类 DefaultMessageStore.java 2、消息存储核心类介绍 private final MessageStoreConfig me…

汇编程序入门指南

什么是机器语言&#xff1f; 机器语言就是由二进制数字构成的程序&#xff0c;CPU 可以直接对其解释、执行。 汇编语言、C 语言、Java、BASIC 等编程语言编写的程序&#xff0c;也都需要先转换成机器语言才能被执行。机器语言有时也叫作“原生代码”&#xff08;Native Code&…

无线麦克风推荐哪些品牌,热门领夹无线麦克风哪个好,看本期文章

​在信息爆炸的今天&#xff0c;高品质的无线领夹麦克风能让声音更清晰响亮。技术发展带来多样化选择同时也带来选择困难。根据多年使用经验和行业反馈&#xff0c;我推荐一系列可靠、易用且性价比高的无线领夹麦克风&#xff0c;助你作出明智选择。还要不知道该怎么选无线领夹…

Day7—zookeeper基本操作

ZooKeeper介绍 ZooKeeper&#xff08;动物园管理员&#xff09;是一个分布式的、开源的分布式应用程序的协调服务框架&#xff0c;简称zk。ZooKeeper是Apache Hadoop 项目下的一个子项目&#xff0c;是一个树形目录服务。 ZooKeeper的主要功能 配置管理 分布式锁 集群管理…

【C++LeetCode】【热题100】两数相加【中等】-不同效率的题解【1】

题目&#xff1a; 暴力方法&#xff1a; /*** 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, ListNo…

模拟算法:代码世界的生活模拟器

✨✨✨学习的道路很枯燥&#xff0c;希望我们能并肩走下来! 文章目录 目录 文章目录 前言 一. 模拟算法的总结 二. 模拟算法题目 2.1 替换所有的问号 2.2 提莫攻击 2.3 Z字形变换 2.4 外观数列 2.5 数青蛙 总结 前言 本篇详细介绍了模拟算法的使用&#xff0c;让…

Word 文本框技巧2则

1 调整大小 一种方法是&#xff0c;选中文本框&#xff0c;周围出现锚点&#xff0c;然后用鼠标拖动来调整大小&#xff1b; 精确按数值调整&#xff0c;在 格式 菜单下有多个分栏&#xff0c;一般最后一个分栏是 大小 &#xff1b;在此输入高度和宽度的数值&#xff0c;来调整…

万能DIY预约小程序源码系统 适合任何行业在线预约报名 带完整的安装代码包以及搭建教程

系统概述 在当今数字化时代&#xff0c;线上预约和报名系统已经成为各行各业不可或缺的工具。为了满足市场需求&#xff0c;万能 DIY 预约小程序源码系统应运而生&#xff0c;它为各类企业和组织提供了一种便捷、高效、灵活的解决方案&#xff0c;可适用于任何行业的在线预约和…

3D营销可以应用于哪些领域?

着科技的飞速发展&#xff0c;3D营销技术正逐渐为各行各业带来前所未有的机遇与挑战&#xff0c;特别是在电商、汽车、数码家电、家居、时尚、教育、制造等领域&#xff0c;其应用愈发广泛。 1. 汽车行业 3D营销为汽车行业打破了时空的界限&#xff0c;构建了逼真的虚拟展厅。…

手把手教程 | 云端部署语音合成神器——ChatTTS

近期&#xff0c;ChatTTS 凭借其高度仿真的 AI 语音合成技术迅速走红&#xff01;ChatTTS 是专为对话场景设计的文本转语音模型&#xff0c;例如 LLM 助手对话任务&#xff0c;支持中英文两种语言。其最大的模型在超过 10 万小时的中英文数据上进行训练&#xff0c;确保了高质量…

来都来了,8个JavaScript技巧奉上

吆喝一声&#xff0c;如果你计算机、软件工程、电子等相关专业本科及以上学历&#xff0c;欢迎来共事。前后端/测试可投&#xff0c;技术大厂。 JavaScript 作为最流行的语言之一&#xff0c;其语法灵活且每年都在不断吸纳新特性&#xff0c;即使是一个从业多年的老手&#xff…

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

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

手机制造计划调度场景下的复杂约束

获取更多资讯,赶快关注上面的公众号吧! 文章目录 手机制造过程大致分为SMT、板测、主板预加工、预组、组装、整测、包装等7大工段,每个工段包含一条或多条线体,根据项目要求和线体配置的差异,项目选择线体的适配度(优先级)不同,而且不同产品的工艺流程可能存在差异,共…

Hedra:让您的照片说话

在数字内容创作的世界里&#xff0c;我们总是在寻找那些能够让我们的作品更加生动和吸引人的工具。Hedra软件就是这样一款工具&#xff0c;它能够让您的照片动起来&#xff0c;甚至说话。想象一下&#xff0c;您的家庭相册中的照片突然变得栩栩如生&#xff0c;或者您的产品图片…

搭建Vue的环境

目录 # 开篇 步骤一&#xff0c;准备Vue 的环境 步骤二&#xff0c;下载Vue.js的包 步骤三&#xff0c;创建并打开写前端代码的文件夹 步骤四&#xff0c;在VSCode中引入Vue.js的包 步骤五&#xff0c;创建第一个vue.html Vue其他知识 Vue.config命令 # 开篇 介绍&…

朝阳医院2018年销售数据 数据分析与可视化

代码及数据集下载传送门 数据分析与可视化-朝阳医院2018销售数据-ipynbcsv 实践内容 以朝阳医院2018年销售数据为例&#xff0c;目的是了解朝阳医院在2018年里的销售情况&#xff0c;这就需要知道几个业务指标&#xff0c;本次的分析目标是从销售数据中分析出以下业务指标&am…

kafka的基本模型

kafka官网 线程和线程之间的数据交互 在jvm里不同的线程有自己的栈内存&#xff0c;但彼此之间交互可以在共享的内存中进行&#xff0c;即堆内存&#xff0c;堆内存会将这些消息放到队列中&#xff0c;具体实现jvm见&#xff0c;栈内存各自维护&#xff0c;堆内存大家共享 进…