递归、搜索与回溯算法

递归

什么是递归?

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

为什么会用到递归?

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

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

如何理解递归?

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

如何写好一个递归?

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

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

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

相关推荐
wordbaby31 分钟前
混合检索:两全其美的艺术
人工智能·算法
彧azz1 小时前
数据结构:关于图的学习
c语言·数据结构·笔记·学习·算法
热心网友俣先生1 小时前
A题-药材的烘干问题-题意逐句翻译
算法·数学建模
2601_960356381 小时前
2026秋招运营分析师能力模型:SQL、指标体系、AIGC与业务分析
算法
hetao17338371 小时前
校内场-提高组 ZYZSC-S-Round 4
c++·算法
彧azz2 小时前
二叉搜索树学习记录
c语言·数据结构·笔记·算法
手写码匠2 小时前
DeepSeek 函数调用实战:从零搭建一个会“动手“的 AI 助手
人工智能·深度学习·算法·aigc
果壳science3 小时前
《自然本源》如何实现狭义相对论的代数化
笔记·算法·几何学
302wanger4 小时前
分享一个工作习惯:整点看即时消息
算法
洋不写bug5 小时前
排序(一)基础排序,插入|希尔|冒泡|直接选择排序详解
java·算法·排序算法·插入排序·冒泡排序·希尔排序·直接选择排序