一、汉诺塔问题
1.链接
面试题 08.06. 汉诺塔问题 - 力扣(LeetCode)
2.描述
3.思路
4.参考代码
class Solution
{
public:void hanota(vector<int>& A, vector<int>& B, vector<int>& C) {dfs(A.size(),A,B,C);}void dfs(int n,vector<int>& A, vector<int>& B, vector<int>& C){if(n == 1){C.push_back(A.back());A.pop_back();return;}dfs(n-1,A,C,B);C.push_back(A.back());A.pop_back();dfs(n-1,B,A,C);}
};
二、合并两个有序链表
1.链接
21. 合并两个有序链表 - 力扣(LeetCode)
2.描述
这题在刚开始学习链表的时候做过,这里我们用递归的思路去再做一次
3.思路
1.找到子问题
合并两个有序的链表(主问题)
在两个链表中,找到较小的头结点链接后续合并好的两个有序链表,然后返回(子问题)
通过子问题的描述,我们可以分析出函数头:
ListNode* dfs(ListNode* list1, ListNode* list2)
2.描述子问题的解决思路
比较当前两个头节点哪个较小,然后找较小的头去链接后续合并好的链表
min_head -> next = dfs(min_head->next,list2);
return min_head;
3.确定出口
当遇到其中一个链表为空,或者两个都为空时,返回另一个链表的头结点即可
4.参考代码
class Solution
{
public:ListNode* mergeTwoLists(ListNode* list1, ListNode* list2) {if(list1 == nullptr) return list2;if(list2 == nullptr) return list1;ListNode* head = list1->val < list2->val ? list1 : list2;if(list1->val < list2->val){head->next = mergeTwoLists(head->next,list2);} else{head->next = mergeTwoLists(list1,head->next);}return head;}
};
三、反转链表
1.链接
206. 反转链表 - 力扣(LeetCode)
2.描述
3.思路
我们将递归想象成一个一定能够完成任务的黑匣子,也就是递归信任
4.参考代码
class Solution
{
public:ListNode* reverseList(ListNode* head) {if(head == nullptr) return nullptr;if(head->next == nullptr) return head;ListNode* newhead = reverseList(head->next);head->next->next = head;head->next = nullptr;return newhead;}
};
四、两两交换链表中的节点
1.链接
24. 两两交换链表中的节点 - 力扣(LeetCode)
2.描述
3.思路
宏观的去看这个问题,我们一样是相信dfs一定能完成任务
4.参考代码
class Solution {
public:ListNode* swapPairs(ListNode* head) {if(head == nullptr) return nullptr;if(head->next == nullptr) return head;ListNode* tmp = swapPairs(head->next->next);//我认为递归能够将2之后的位置完成交换,然后返回其交换后的头结点ListNode* newhead = head->next;newhead->next = head;head->next = tmp;return newhead;}
};
五、Pow(x,n)
1.链接
50. Pow(x, n) - 力扣(LeetCode)
2.描述
3.思路
快速幂是一个经典的算法思想,当我们需要计算一个x的n次方时,可以先将其x的n/2次方计算出来
4.参考代码
class Solution {
public:double myPow(double x, int n) {if(n<0){long long t = -(long long)n;return 1/dfs(x,t);}else{return dfs(x,n);}}double dfs(double x,long long n){if(n == 0) return 1.0;double tmp = dfs(x,n/2);return n%2==0? tmp*tmp : tmp*tmp*x;}
};
总结
本篇讲了一些简单的关于递归思想的题目,重点是培养递归思想的思考方式,如何找子问题等等