首页 > 编程语言 >【算法】递归

【算法】递归

时间:2024-09-24 09:51:32浏览次数:11  
标签:head ListNode 递归 nullptr next 算法 return

【ps】本篇有 5 道 leetcode OJ。 

目录

一、算法简介

二、相关例题

1)汉诺塔问题

.1- 题目解析

.2- 代码编写

2)合并两个有序链表

.1- 题目解析

.2- 代码编写

3)反转链表

.1- 题目解析

.2- 代码编写

4)两两交换链表中的节点

.1- 题目解析

.2- 代码编写

5)Pow(x, n)

.1- 题目解析

.2- 代码编写


一、算法简介

        常见的、典型的搜索算法有 BFS(宽度优先搜索)和 DFS(深度优先搜索)。

        而递归是搜索算法的基础。如果将递归看作是一个大类,那么搜索算法就是递归下面的一个分支,因此要掌握搜索算法,就必须掌握递归。

【Tips】递归是什么?

        简单来说,递归就是一个函数自己调用自己的行为。


【Tips】为什么会用到递归?

        把一个问题看作是主要问题,这个主要问题可以划分为若干个相同的子问题,递归就主要针对这种场景。


【Tips】如何理解递归?

  1. 画递归展开的细节图(本质是对一棵树进行DFS);
  2. 借助二叉树的相关题目;
  3. 宏观看待递归的过程:不要在意递归展开的细节图!把递归的函数当成是一个黑盒,相信这个黑盒一定能完成任务!

【Tips】如何写好递归?

  1. 函数头的设计:先找到相同的子问题!
  2. 函数体的书写:只关心某一个问题是如何解决的!
  3. 递归函数的出口:问题不能再细分的临界条件!

二、相关例题

1)汉诺塔问题

面试题 08.06. 汉诺塔问题

.1- 题目解析

        假设 n = 1,只有一个盘子,很简单,直接把它从 A 中拿出来,移到 C 上。

        如果 n = 2 ,就要借助 B 了,因为小盘子必须时刻都在大盘子上面,共需要 3 步。

        如果 n > 2 呢?思路和上面是一样的,我们可以把 n 个盘子看成两个部分,一部分有 1 个盘子,另一部分有 n - 1 个盘子,于是就将最初的 n 个盘子从 A 移到 C 的问题,转化成了将 n - 1 个盘子从 A 移到 C 的问题, 依次类推,直至转化成 1 个盘子的问题时,问题也就解决了。

        如果原问题可以分解成若干个与原问题结构相同但规模较小的子问题,往往可以用递归的方法解决:

  1.  n = 1 时,直接把盘子从 A 移到 C;
  2.  n > 1 时,先把上面 n - 1 个盘子从 A 移到 B(子问题,递归);再将最大的盘子从 A 移到 C;最后将 B 上 n - 1 个盘子从 B 移到 C(子问题,递归)。

.2- 代码编写

class Solution {
public:
    void hanota(vector<int>& A, vector<int>& B, vector<int>& C) {
        dfs(A,B,C,A.size());
        //参数说明:待转移的盘子、中转位置的盘子、目的位置的盘子、转移的盘子个数
    }
    //1.函数头
    void dfs(vector<int>& A, vector<int>& B, vector<int>& C,int n)
    {
        //3.递归出口
        if(n==1)
        {
            C.push_back(A.back());
            A.pop_back();
            return;
        }
        //2.函数体
        dfs(A,C,B,n-1);
        C.push_back(A.back());
        A.pop_back();
        dfs(B,A,C,n-1);

    }
};

2)合并两个有序链表

21. 合并两个有序链表

.1- 题目解析

.2- 代码编写

/**
 * 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) {
        return dfs(list1,list2);
    }
    ListNode* dfs(ListNode* l1,ListNode* l2)
    {
        if(l1==nullptr) return l2;
        if(l2==nullptr) return l1;
        if(l1==nullptr && l2==nullptr) return nullptr;

        if(l1->val<=l2->val)
        {
            l1->next=dfs(l1->next,l2);
            return l1;
        }
        else
        {
            l2->next=dfs(l1,l2->next);
            return l2;
        }
    }
};

3)反转链表

206. 反转链表

.1- 题目解析

.2- 代码编写

/**
 * 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* newhead=reverseList(head->next);
        head->next->next=head;
        head->next=nullptr;
        return newhead;
    }
};

4)两两交换链表中的节点

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

.1- 题目解析

        两两为一组进行逆置。

.2- 代码编写

/**
 * 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;
        ListNode* ret=head->next;
        ListNode* tmp=swapPairs(ret->next);
        ret->next=head;
        head->next=tmp;
        return ret;
    }
};

5)Pow(x, n)

50. Pow(x, n)

.1- 题目解析

        本题涉及快速幂算法,用递归实现快速幂即可。

.2- 代码编写

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;
    }
};

标签:head,ListNode,递归,nullptr,next,算法,return
From: https://blog.csdn.net/waluolandao/article/details/142380924

相关文章

  • 【数据结构和算法实践-排序-归并排序】
    数据结构和算法实践-排序-归并排序题目MyThought代码示例JAVA-8题目排序MyThought然后再进行递归,递归要注意两个方面:一、自我调用二、终止条件:即函数边界注意点:树、递归*代码示例JAVA-8publicclassMergeSort{publicstaticvoidmergeSor......
  • 25赛季算法(视觉)组培训计划
    1.第一阶段(通识认识和环境配置)9.27-10.7注:第一阶段采用线上直播模式视觉算法组通识认识,如何查找资料Ubuntu环境介绍和系统安装,和基本命令C++介绍,程序的编译链接简介,cmake的简单使用,程序编辑器的安装第一次作业:在ubuntu下配置一个完整的cmake编译环境。并完成自己的第......
  • Day 23 贪心算法part01| LeetCode 455.分发饼干,376.摆动序列,53.最大子序和
    455.分发饼干455.分发饼干classSolution{publicintfindContentChildren(int[]g,int[]s){Arrays.sort(g);Arrays.sort(s);intindex=s.length-1;intcount=0;for(inti=g.le......
  • Springboot基于协同过滤算法的电影推荐系统56rs8程序+源码+数据库+调试部署+开发环境
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表系统功能:用户,电影类型,电影信息,网站资讯,资讯类型开题报告内容一、研究背景与意义随着互联网技术的飞速发展,电影资源日益丰富,用户面临的选择也愈发多样化。......
  • 机器学习实战25-用多种机器学习算法实现各种数据分析与预测
    大家好,我是微学AI,今天给大家介绍一下机器学习实战25-用多种机器学习算法实现各种数据分析与预测。本文主要介绍了使用机器学习算法进行数据分析的过程。首先阐述了项目背景,说明进行数据分析的必要性。接着详细介绍了机器学习算法中的随机森林、聚类分析以及异常值分析等方法......
  • 算法题:数组中的第K个最大元素
    数组中的第K个最大元素问题描述:在未排序的数组中找到第K个最大的元素。解题思路:可以使用最小堆(优先队列)来解决这个问题。将数组中的元素依次加入最小堆中,当堆的大小超过K时,就弹出堆顶元素(即当前最小的元素)。最后,堆顶元素即为第K个最大的元素。Java代码实现(这里使用Java的......
  • 算法与数据结构学习路线图
    基础阶段编程语言基础:选择一门编程语言作为学习算法与数据结构的工具,如Python、Java、C++等,掌握其基本语法、数据类型、控制结构、函数等。这是后续学习的基础。学习时间:建议花费1-2个月左右打牢基础。学习网站及资源:菜鸟教程:网址为https://www.runoob.com/,提供各种编程......
  • leetcode刷题day27|贪心算法Part01(455.分发饼干、376. 摆动序列、53. 最大子序和)
    前言:贪心的本质选择每一阶段的局部最优,从而达到全局最优。455.分发饼干思路:局部最优-大饼干喂给胃口大的,充分利用饼干尺寸喂饱一个;全局最优:喂饱尽可能多的小孩。可以尝试使用贪心策略,先将饼干数组和小孩数组排序,然后从后向前遍历小孩数组,用大饼干优先满足胃口大的,并统计......
  • 基于真实山地场景下的超多目标优化算法求解无人机三维路径规划,MATLAB代码
    超多目标优化算法是一类专门用于解决存在三个以上目标函数的最优化问题的算法。这类问题在现实世界中非常常见,例如在工程设计、资源管理、机器学习等领域。由于目标之间的冲突性,很难找到一个单一的解来同时优化所有目标,因此超多目标优化算法旨在找到一组解,这些解在目标之间......
  • ADAU1701的Dynamics Processors算法补充例程合集(10个例程)
    作者的话做ADAU1701,心血来潮,再过了一遍SigmaDSP的算法合辑,发现有不少遗留的,比较有特点的算法,就在这个系列文章里一一呈现吧。ADAU1701我写了超过100个例程,但是都很早期,2018年开始弄的,我感觉并不是很全,那这一次就彻底把他补全一下,这个系列文章,将把我能够找到的,ADI原厂提供......