递归、搜索与回溯算法

递归

什么是递归?

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

为什么会用到递归?

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

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

如何理解递归?

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

如何写好一个递归?

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

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

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

相关推荐
To_OC1 天前
LC 1 两数之和:面试第一道必考题,暴力解法直接被面试官 pass
javascript·算法·leetcode
鱼鱼不愚与1 天前
《原来如此 | 第01期:为什么导航软件能预测红绿灯倒计时?》
算法
复杂网络2 天前
论最小 Agent 计算机的形态
算法
kisshyshy2 天前
🍦 雪糕、食堂、火车厢:三幅漫画吃透栈、队列与链表
javascript·算法
猿人谷2 天前
不只是 CPU 阈值:STAR 如何用 GAT + Transformer 做容器级自动扩缩容?
人工智能·算法
复杂网络3 天前
Stable Diffusion 视觉大模型微调技术深度调研
算法
复杂网络3 天前
基于 Stable Diffusion 架构的视觉大模型代表性工作与原理深度解析
算法
MrZhao4003 天前
Agent Loop 如何用 Hook 扩展:权限、日志与工具拦截
算法
MrZhao4003 天前
Agent 为什么需要 Skills:别把所有知识都塞进 system prompt
算法