小工具知识网

当前位置: 首页 > 行业知识 > 【算法】递归

行业知识

【算法】递归

2026-11-11 17:37:26 来源:互联网转载

一.基本概念

1.什么是递归?

���数自己调用自己,主问题由相同的子问题组成,子问题又由相同的子问题组成。

2.如何理解递归?

不要在意递归的细节展开图,把递归的函数当成一个黑盒,相信这个黑盒一定能完成这个任务。

eg:二叉树的遍历,归并排序,快排

3.方法论

1.先找到相同的子问题(确定函数头,参数返回类型)

2.只关心某一个子问题是怎么解决(确定主函数体)

3.确定函数终止条件(确定递归出口)

二.汉诺塔问题

思路:

两个盘子时,假设有a b c三个柱子,把a移到c,盘子设为1 2 从上到下升序排列。先把1移到辅助柱子b,再把2移到c,最后把1移到c。

三个盘子时,先处理上面两个,用同样的方法,假设从上到下123,目标是把12先移到b,把3移到c。先把1移到辅助柱子c,然后2移到b,c移到b,3移到c。再把1移到辅助柱子1,2移到3,1移到3.

可以看到当n个盘子时,n-1个盘子是它的子问题。

方法论

1.重复子问题:将a柱子上的几个盘子借助辅助柱子b放到另一根柱子c上,函数参数便可以得知a,b,c,n(几个盘子要转移)。recursion(a,b,c,n)

2.函数体实现:

step1.N=n时,先把a的n-1个盘子由辅助盘c转移到b

recursion(a,c,b,n-1)

step2.把a剩下的一个移到c

a.back()->c

step3.把b上的n-1个盘子借助辅助柱子a转移到c

recursion(b,a,c,n-1)

3.递归出口

n=1时,直接将a移到c

代码实现

class Solution {public:    void hanota(vector& a, vector& b, vector& c) {        recursion(a,b,c,a.size());    }    void recursion(vector& a, vector& b, vector& c,int n)    {        if(n==1)        {            c.push_back(a.back());            a.pop_back();            return;        }        recursion(a,c,b,n-1);        c.push_back(a.back());        a.pop_back();        recursion(b,a,c,n-1);    }};

三.链表

反转链表

思路1:从宏观角度看待

1.让当前节点后面的链表先逆置,并且把头结点返回。(相信你一定能完成)

2.让当前节点添加到逆置后的链表即可

思路2:将链表看成一棵树(后序遍历)

1.深度优先遍历一次即可

代码实现

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

两两交换链表中的节点

思路:宏观角度看问题

先交换前两个节点,然后连接后面剩下的节点,结束条件当为空或者后面无节点。

代码实现:

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

快速幂

实现pow(x,n)

代码实现

class Solution {public:    double myPow(double x, int n) {        return n        if(n==0)            return 1;        double tmp=pow(x,n/2);        return n%2==0?tmp*tmp:tmp*tmp*x;    }};

上一篇:揭秘神秘数字744背后的故事与含义!

下一篇:轻松掌握RVCAI下载步骤,一键下载不迷路!