递归、搜索与回溯算法

递归

什么是递归?

所谓的递归其实就是函数自己调用自己的情况

为什么会用到递归?

举几个我们之前学习过的例子:二叉树的遍历、快速排序、归并排序,都是用递归来解决的,比如二叉树的后序遍历实现方式:是先遍历左子树再遍历右子树,最后访问根节点,而遍历左子树和遍历右子树的过程也都可以分成:先遍历左子树再遍历右子树,最后访问根节点,直到不能再划分位置;而快速排序的实现方式:选择一个基准元素,将数组划分为大于基准元素和小于基准元素两个区间,然后对两个区间再次分别选择一个基准元素,将数组划分为大于基准元素和小于基准元素两个区间,直到不能再划分为止,这个时候我们就会发现数组已经有序了;归并排序的实现方式:将数组分为两个区间,对这两个区间分别进行排序后,将两区间合并,而对这两区间的排序则是通过再次将这两个区间分别分为两个子区间,分别排序后进行合并,直到不能划分为止,合并完成后我们会发现数组已经有序了。

我们可以发现上述三个例子有一个共性:它们的问题都可以拆分成相同的子问题,子问题也可以继续拆分,直到不可拆分为止。

如何理解递归?

在能够简单地画出递归的细节展开图和能解决一些简单的二叉树题目后,我们就可以开始以一个宏观的视角看待递归了。第一点:不要太在意递归的细节展开,第二点:把递归函数看作一个黑盒,第三点:相信这个黑盒能够完成任务。

如何写好一个递归?

首先是函数头的书写,递归适用于解决能不断拆分为相同子问题的问题,则为了正确书写函数头,我们需要先找到相同的子问题。

其次是函数体的书写,由于拆分出来的子问题实际上与父问题一样,我们书写函数体时,只需要关心某一个子问题是怎么解决的。

最后是递归的出口,因为递归注定是不能无限递归下去的,我们需要找到问题无法再拆分的条件,这就是递归函数的出口。

相关推荐
:-)7 小时前
算法-归并排序
java·开发语言·数据结构·算法·排序算法
Jerry11 小时前
LeetCode 101. 对称二叉树
算法
可编程芯片开发12 小时前
基于MPPT最大功率跟踪的离网光伏发电系统Simulink建模与仿真
算法
AI科技星12 小时前
线性算子不是空间映射函数,是全域双螺旋场之间拉伸、旋转、耦合、坍缩的跨空间标准化变换载体《全域数学vs传统数学:人类文明进阶200讲》第80讲
线性代数·算法·矩阵·数据挖掘·回归·乖乖数学·全域数学
米罗篮12 小时前
矩阵快速幂 (Exponentiation By Squaring Applied To Matrices)
c++·线性代数·算法·矩阵
dream_home840712 小时前
图像算法模型NPU适配与算法服务实战指南
人工智能·python·算法·npu 图像服务
大鱼>13 小时前
多宠物家庭智能管理平台:云端架构与多设备协同实战
python·算法·iot·宠物
To_OC13 小时前
LC 22 括号生成:刷完这道题,我终于搞懂回溯剪枝了
javascript·算法·leetcode
To_OC14 小时前
LC 39 组合总和:回溯入门必刷题,我踩过的两个坑都在这了
javascript·算法·leetcode
数字杂技师14 小时前
每条推荐都很准,为什么我还是越刷越无聊?
算法