常见递归模式

news/2024/11/29 13:44:24/

常见递归模式

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

 


递归模式

常见递归模式:

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

遍历二叉树模式

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

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( 路径 )returnfor 选择 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 a in arr:res = 最值(res, dp(arr, 某状态));return res;
}

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

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


http://www.ppmy.cn/news/19250.html

相关文章

【MySQL基础】MySQL多表操作详解

序号系列文章4【MySQL基础】MySQL表的七大约束5【MySQL基础】字符集与校对集详解6【MySQL基础】MySQL单表操作详解7【MySQL基础】运算符及相关函数详解文章目录前言1,多表关系1.1,一对一1.2,一对多1.3,多对多2,多表查询…

Keil C51工程转VSCode Keil Assistant开发全过程

Keil C51工程转VSCode Keil Assistant开发全过程✨这里以stc15W408AS为例。📌相关篇《【开源分享】自制STC15W408AS开发板》 📺编译-烧录演示: 📋转VSCODE开发环境主要原因可能代码提示以及代码跳转功能,或者其他。 &…

Python(for和while)循环嵌套及用法

Python 不仅支持 if 语句相互嵌套,while 和 for 循环结构也支持嵌套。所谓嵌套(Nest),就是一条语句里面还有另一条语句,例如 for 里面还有 for,while 里面还有 while,甚至 while 中有 for 或者 …

Nginx与LUA(7)

您好,我是湘王,这是我的CSDN博客。值此新春佳节,我给您拜年啦~祝您在新的一年中所求皆所愿,所行皆坦途,展宏“兔”,有钱“兔”,多喜乐,常安宁!软件开发中&…

React错误边界

首先 我们先构建出问题的场景 我们创建一个react项目 然后在src下创建 components 文件夹目录 在下面创建一个 error.jsx 组件 参开代码如下 import React from "react";export default class App extends React.Component{constructor(props){super(props);this.…

【每日一题Day97】LC1828统计一个圆中点的数目 | 模拟

统计一个圆中点的数目【LC1828】 给你一个数组 points ,其中 points[i] [xi, yi] ,表示第 i 个点在二维平面上的坐标。多个点可能会有 相同 的坐标。 同时给你一个数组 queries ,其中 queries[j] [xj, yj, rj] ,表示一个圆心在 …

单绞机控制算法模型(Simulink仿真)

线缆行业单绞机PLC控制算法详细解读可以参看下面的文章链接: 线缆行业单绞机控制算法(详细图解+代码)_RXXW_Dor的博客-CSDN博客在了解单绞机之前需要大家对收放卷以及排线控制有一定的了解,不清楚的可以参看下面几篇博客,这里不再赘述,受水平和能力所限,文中难免出现错…

议论文书写总结

观点如何引入以及背后原理议论文的书写有一个常用的书写模板,也就是五分三式。有人说这种模板的得分不高,也有人只要核心内容切实、不空范,论证严谨就也是可以的。那么议论文该如何才能写好。以下仅为随笔,进行思考的记录。议论文…