递归、搜索与回溯算法

递归

什么是递归?

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

为什么会用到递归?

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

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

如何理解递归?

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

如何写好一个递归?

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

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

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

相关推荐
地平线开发者1 小时前
ReID/OSNet 算法模型量化转换实践
算法·自动驾驶
地平线开发者2 小时前
开发者说|EmbodiedGen:为具身智能打造可交互3D世界生成引擎
算法·自动驾驶
星星火柴9363 小时前
关于“双指针法“的总结
数据结构·c++·笔记·学习·算法
艾莉丝努力练剑4 小时前
【洛谷刷题】用C语言和C++做一些入门题,练习洛谷IDE模式:分支机构(一)
c语言·开发语言·数据结构·c++·学习·算法
C++、Java和Python的菜鸟5 小时前
第六章 统计初步
算法·机器学习·概率论
Cx330❀5 小时前
【数据结构初阶】--排序(五):计数排序,排序算法复杂度对比和稳定性分析
c语言·数据结构·经验分享·笔记·算法·排序算法
散1125 小时前
01数据结构-Prim算法
数据结构·算法·图论
起个昵称吧5 小时前
线程相关编程、线程间通信、互斥锁
linux·算法
myzzb6 小时前
基于uiautomation的自动化流程RPA开源开发演示
运维·python·学习·算法·自动化·rpa
旺小仔.7 小时前
双指针和codetop复习
数据结构·c++·算法