
递归是一种在算法中广泛应用的思想,其主体思想是通过将复杂的问题分解为更简单的子问题来求解。具体而言,递归通常包括以下几个要素:
最小实例 ,直接返回结果,不再进行进一步的递归。
基本情况 时,递归算法会将问题 拆分成更小的子问题 。算法会调用自身来解决这些子问题,通常会在调用中传递参数以反映问题的简化。
会将子问题的结果合并***,以得到原始问题的解。
递归的优势在于其代码通常更简洁且易于理解,尤其是在处理分治问题(如排序、搜索等)时。然而,递归也可能导致栈溢出问题,因为每次调用都会在栈上占用空间,因此在使用时需要考虑调用深度和性能优化。
下面,我们就用习题来给大家做解释吧!
题目链接:汉诺塔

递归函数流程:
解题思路:
n-1盘全部移到B上去
第n盘移到C上去
n-1盘移到C上去
代码如下:
class Solution {
public:
void hanota(vector<int>& A, vector<int>& B, vector<int>& C) {
dfs(A, B, C,A.size());
}
void dfs(vector<int>& A, vector<int>& B, vector<int>& C,int n)
{
if(n==1)
{
C.push_back(A.back());
A.pop_back();
return;
}
dfs(A, C, B,n-1);//这一步是为了将除了最大的盘子留下外,其他全部转移到B盘
C.push_back(A.back());
A.pop_back();//这一步是为了把最大的盘子转移到C盘
dfs(B, A, C,n-1);//这一步是进行递归,B盘变成了A盘,A盘变成了B盘,目的是为了将其他盘全部转移到C盘
}
};题目链接:合并两个有序链表 题目描述:将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。

算法思路:
注意注意注意:链表的题⼀定要画图,搞清楚指针的操作!
解题思路:
另一个参数
比较l1的元素和l2元素的大小
该节点的next 和 另一节点 作为下一轮递归函数的参数
返回值变为该节点的next
class Solution {
public:
ListNode* mergeTwoLists(ListNode* list1, ListNode* list2) {
if(list1==NULL)
{
return list2;
}
if(list2==NULL)
{
return list1;
}
if(list1->val<=list2->val)
{
list1->next=mergeTwoLists(list1->next, list2);
return list1;
}
else
{
list2->next=mergeTwoLists(list1, list2->next);
return list2;
}
}
};题目链接:反转链表
题⽬描述:

解题思路:
尾就是新的头节点head 做为参数,传给递归函数递归函数:
head->next作为参数进入下一次递归head->next=nullptr;class Solution {
public:
ListNode* reverseL(ListNode* head)
{
if(head->next==nullptr)
return head;
else
{
reverseL(head->next)->next=head;
head->next=nullptr;
return head;
}
}
ListNode* reverseList(ListNode* head) {
ListNode* it=head;
if(head==nullptr)
return head;
while(it->next!=nullptr)
{
it=it->next;
}
reverseL(head);
return it;
}
};题目链接:两两交换链表中的节点 题目描述:

解题思路:
head->next->next作为参数进行下一次递归交换head和head->nextclass Solution {
public:
ListNode* swapPairs(ListNode* head) {
if(head==nullptr)
{
return nullptr;
}
else if(head->next==nullptr)
{
return head;
}
head->next->next=swapPairs(head->next->next);
ListNode* it=head->next;
head->next=head->next->next;
it->next=head;//交换head和head->next
return it;
}
};解决递归问题时,可以遵循以下经验:
通过遵循这些经验,可以更有效地解决递归问题,并提高代码的清晰性和可维护性。
好啦,递归问题就讲到这里,下一次讲解的是二叉树的深度搜索,我们下次再见