常见递归模式

news2024/9/22 19:20:12

常见递归模式

    • 递归模式
      • 遍历二叉树模式
      • 回溯模式
      • 子问题分解模式

 


递归模式

常见递归模式:

  • 遍历二叉树模式
  • 回溯模式
  • 子问题分解模式
     

遍历二叉树模式

只要涉及递归的问题,都是树的问题,或者说树的遍历。

void traverse(TreeNode root) { // 遍历二叉树
    if (root == null) return;  // 递归结束条件
    print(root.val)            // 前序位置,在进入左节点前,输出当前节点
    traverse(root.left);       // 进入左子树
    print(root.val)            // 在中序位置,在进入右节点前,输出当前节点
    traverse(root.right);      // 进入右子树
    print(root.val)            // 在后序位置,离开后节点后,输出当前节点
}

这个代码的关键在于,时机。下图是可视化过程:

这里主要强调前序、后序的区别。

  • 前序能解决的问题:遍历二叉树直接计算出来
  • 后序能解决的问题:遍历二叉树直接计算出来,及遍历完子树之后才能计算出来。

递归函数,二叉树的每一个节点需要做什么(回溯模式、分解子问题模式),需要在什么时候(前\中\后序)做。
 


回溯模式

使用场景:问题可通过遍历一棵二叉树得到答案。

ans = []
void recall( 路径,[选择列表] )
	if 满足结束条件:
		ans.add( 路径 )
		return
		
	for 选择 in [选择列表]:
		做选择
		recall( 路径,[选择列表] )
		撤销选择

回溯框架,本质是遍历一颗决策树。

  • 路径:已经做出的选择
  • 选择列表:当前可以做的选择
  • 结束条件:到了决策树底层,无法再做选择


核心在于 for 循环里面的递归,在递归之前做选择,在递归之后撤销选择。

  • for 循环,如果可视化就是在遍历一颗 N 叉树

问题是,选择和撤销选择是在这颗树上做什么呢?

  • 选择:是在这棵树上做前序遍历
  • 撤销选择:是在这颗树上做后序遍历


选择是,在进入树的某一节点前执行。

撤销选择是,在离开树的某一节点后执行。

做选择:在进入节点前,从选择列表拿出一个选择,将它放入路径。

撤销选择:在离开节点后,从路径中拿出一个选择,将它恢复到选择列表中。
 


子问题分解模式

使用场景:可通过子问题/子树的答案推导出原问题的答案。

原问题,分解成当前节点 + 左右子树的子问题。

int dp(TreeNode root) {        // 版本一
    if (root == null) 
		return 0;
		
    // 分解(子问题的规模为n/2,求出前半部分的最值,和后半部分的最值)
    int left = dp(root.left);
	int right = dp(root.right);
 
    // 合并(在把前半部分的最值和后半部分的最值做个比较,相当于求整个大数组的最值)
    return 最值(left, right);
}

int dp(int arr[], 某状态) {    // 版本二
    for 选择 in [选择列表]:
        res = 最值(res, dp(arr, 某状态));
    return res
}

因为位置的原因,前序位置的代码只能从函数参数中获取父节点传递来的数据,而后序位置的代码不仅可以获取参数数据,还可以获取到子树通过函数返回值传递回来的数据。

一旦发现问题和子树有关,我们用后序位置 + 给函数设置返回值,可以简化代码。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/177019.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

混合背包问题

混合背包问题一、问题二、分析三、代码一、问题 二、分析 混合背包问题就是将我们之前讲过的01背包,完全背包,分组背包,多重背包问题等等中的任意几个混合在一起。因此想要解决这个问题,就需要对01背包,完全背包&…

PDF划词翻译软件

PDF划词翻译 一个简单的PDF划词翻译软件。 Github仓库地址:https://github.com/WCX1024979076/simple_pdf_translator Github下载地址: https://github.com/WCX1024979076/simple_pdf_translator/releases/tag/v0.1.0 Gitee仓库地址: htt…

ROS2机器人编程简述humble-第三章-COMPUTATION GRAPH .2

ROS2机器人编程简述humble-第三章-PERCEPTION AND ACTUATION MODELS .1避开障碍物计算图如何呢?该应用程序的计算图非常简单:订阅激光主题的节点向机器人发布速度命令。控制逻辑解释:输入的感知信息并产生控制命令(输出&#xff0…

深度学习:DenseNet思想总结

深度学习:DenseNet思想总结前言DenseNetResNetDense connectionComposite functionPooling layersGrowth rateBottleneck layersCompressionImplementation Details总结前言 论文中提出的架构为了确保网络层之间的最大信息流,将所有层直接彼此连接。为了…

JUC面试(八)——阻塞队列

阻塞队列 队列,FIFO BlockingQueue 阻塞队列,排队拥堵,首先它是一个队列,而一个阻塞队列在数据结构中所起的作用大致如下图所示: 线程1往阻塞队列中添加元素,而线程2从阻塞队列中移除元素 当阻塞队列是空…

Java基础(程序流程控制)

程序流程控制1..顺序结构程序从上到下逐行执行,中间没有判断和跳转2.分支结构根据条件,选择性执行某段代码有if-else和switch-case两种分支需要注意根据相应的方法,来输入指定类型的值。如果不匹配则会异常:InputMisMatchExceptio…

结构型模式-桥接模式

1.概述 现在有一个需求,需要创建不同的图形,并且每个图形都有可能会有不同的颜色。我们可以利用继承的方式来设计类的关系: 我们可以发现有很多的类,假如我们再增加一个形状或再增加一种颜色,就需要创建更多的类。试…

2.5总线标准

文章目录一、引子二、总线标准1.基本概念2.总线标准(1)系统总线①ISA②EISA扩展总线③拓展(2)局部总线①VESA②PCI③AGP④PCI-E(3)设备总线①RS-232C②SCSI③PCMCIA④USB3.连接硬盘总线标准①IDE②SATA三、…

JAVA 服务内存占用太高

一、问题现象 某天,运维老哥突然找我:“你们的某 JAVA 服务内存占用太高,告警了!GC 后也没释放,内存只增不减,是不是内存泄漏了!” 然后我赶紧看了下监控,一切正常,距离上…

redis缓存问题引进

1、缓存使用 为了系统性能的提升,我们一般都会将部分数据放入缓存中,加速访问。而 db 承担数据落 盘工作。 哪些数据适合放入缓存?  即时性、数据一致性要求不高的  访问量大且更新频率不高的数据(读多,写少&…

BigDecimal BigInteger的使用

1、BigDiCemal 【问题】在项目中,我们进行计算的时候,有时候需要考虑 四舍五入,精度丢失的问题,面对这种问题,我们应该怎么处理? System.out.println(0.20.1);System.out.println(0.3-0.1);System.out.prin…

SEO中社交信号的重要性:Facebook分析

你可能认为 SEO中的社交信号是一些无用的社交账号,但它在搜索引擎优化中占有重要地位。Facebook是目前全球最大的社交媒体平台,它已经成为我们日常生活不可缺少的一部分。如何分析和利用好 Facebook,是我们学习 SEO的重中之重。在接下来的内容…

58 应用服务 hang 住, 导致服务 503 Service Unavailable

前言 这是之前 我们测试环境出现的一个问题 一个项目, 代码调整了之后, 发布到测试环境 之后, 几分钟之后 整个系统访问这个服务 出现了 "503 Service Unavailable", 然后 当时的处理方式为 临时重启服务 但是过了一会儿之后 同样的问题还是会出现, 导致 前端服务…

Functions重要部分

Functions1. Defining Functions2. Looking Up Names in Environments1. Defining Functions 赋值(Assignment)是一种简单的抽象方式:把值(values)和名称(names)联系起来。 定义函数&#xff0…

《从零开始编写一个直播服务器》 C++ 实现一个最简单的RTSP流媒体服务器

流媒体开发系列文章 文章目录流媒体开发系列文章前言一、rtsp流是什么?二、使用步骤1.服务器代码总结前言 在安防行业中,onvif协议与gb协议是两种标准,gb是国内安防行业的标准,onvif是国外的安防行业的标准,其中gb281…

AcWing 1013. 机器分配(分组背包问题与方案记录)

一、题目 二、思路 这道题其实不太容易看出背后的模型。这道题本质上是一个分组背包问题。我们将每一个公司看成一组,而在每一个组内,将不同情况下的盈利状况看作物品的价值,而得到这种利益所需的机器数目看作物品的体积。 因此&#xff0c…

SpringSession笔记

第一章、Session会话管理概述Session和Cookie回顾Session机制由于HTTP是无状态的协议,每次浏览器与服务器的交互过程就是一次对话,对话结束之后服务器不能记住你这个人。下次对话的时候服务端无法识别你是上次的人,所以需要一种机制来记录用户…

Win10 突然蓝屏安全模式进不了,没有别的电脑和装机U盘,怎么把资料临时导出来?

环境: Win 10专业版 DELL 3490 移动硬盘/普通U盘 问题描述: Win10 突然蓝屏安全模式进不了,没有别的电脑和装机U盘,怎么把资料临时导出来?目前可以进入Win RE 疑难-高级选项 解决方案: 1.先插入,移动硬盘或者普通U盘 2.多重启几次,自动修复系统失败画面,点击高…

Linux嵌入式开发——压缩与解压缩

文章目录Linux嵌入式开发——压缩与解压缩一、前期准备二、Linux下的压缩格式三、gzip压缩工具1、gzip压缩文件2、gzip压缩文件夹四、bzip2压缩工具五、tar打包工具tar参数对.tar.bz2进行压缩和解压缩压缩解压缩对.tar.gz进行压缩和解压缩压缩解压缩六、其他格式的压缩和解压缩…

Qt扫盲-网络编程概述

网络编程概述一、Qt网络编程概述二、Qt对Http,FTP应用层协议支持三、TCP通信编程支持四、UDP通信编程支持五、主机信息的获取六、网络代理七、底层管理的支持一、Qt网络编程概述 Qt Network模块提供了允许我们编写TCP/IP客户端和服务器的类。它提供了低级类来完成基…