目录
前言
本篇文章是关于递归的详细总结。
正文
递归三要素
- 确定递归的参数和返回值。
确定哪些参数是递归的过程中需要处理的,那么就在递归函数⾥加上这个参数, 并且还要明确每次递归的返回值是什么,进⽽确定递归函数的返回类型。
- 确定终⽌条件:
写完了递归算法, 运⾏的时候,经常会遇到栈溢出的错误,就是没写终⽌条件或者终⽌条件写的不对,操作系统也是⽤⼀个栈的结构来保存每⼀层递归的信息,如果递归没有终⽌,操作系统的内存栈必然就会溢出。
- 确定单层递归的逻辑:
确定每⼀层递归需要处理的信息。在这⾥也就会重复调⽤⾃⼰来实现递归的过程。
饭前零食——何为递归
- 递归是指在函数中调用函数本身的现象。
- 递归的本质是将问题拆分成较小规模的子问题。
- 一般情况来说:如果让空节点(空指针)进入递归,就不加if,如果不让空节点进入递归,就加if限制一下, 终止条件也会相应的调整。
饭前水果
1. 合并两个有序链表
题目
code
/**
* 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* L1, ListNode* L2) {
//1. 直接拼接节点,2. 递归拼接 20:42->
if(L1==nullptr)
return L2;
if(L2==nullptr)
return L1;
if(L1->val>L2->val)
{
L2->next = mergeTwoLists(L1,L2->next);
return L2;
}
else
{
L1->next = mergeTwoLists(L1->next,L2);
return L1;
}
}
};
总结
若有更好的方法,欢迎指正~有兴趣可看一下我的其他文章。本系列持续更新。
编程题分类——其他算法
编程题分类——模拟
编程题分类——排序
编程题分类——回溯
编程题分类——搜索算法
编程题分类——队列&栈
编程题分类——动态规划
编程题分类——树
编程题分类——链表