数据结构递归算法总结

递归算法时数据结构中的重要思想,但对于算法问题来说,利用递归思想解决问题有几种模式可以总结下来

  1. 简单递归

简单直接的调用自己即为简单递归,典型题目:

  • 求解n!
function fn(n) {if (n === 0) return 1;return n * fn(n - 1);
}
  1. 尾递归

函数最后一步是递归,并且最后的递归操作只返回自己,经典题目

  • 求解n!的尾递归写法
function fn(n, accumulator) {if (n === 0) return accumulator;return fn(n - 1, accumulator * n);
}
注:普通递归,会在每次递归时创建新的栈帧,尾递归则会复用栈帧,不新建栈帧,所以相对而言会将空间复杂度将为O(1)
  • 为什么要创建新的栈帧?
    每次调用都需要一个独立的执行上下文(包括参数、局部变量、返回地址等)。创建新的栈帧使得函数调用可以独立、安全地执行,不会干扰其他调用或被其他调用干扰
  1. 循环中嵌套递归

循环中嵌套递归,是一种常用的讲解算法问题的方式。通过循环中嵌套递归,可以进行树和图的遍历,包括DFS、BFS等;可以达到分治的目的,分解大问题成小问题;还可以达到回溯的目的,看是否满足要求;还有对一些嵌套数据的处理等

  1. 树和图的遍历

  2. 分治和回溯问题

  3. 多层嵌套数据结构处理

  • 从嵌套数据中查找
//从address中查找匹配id的数据const address = {id: "1",name: "北京市",children: [{id: "1-1",name: "东城区",},{id: "1-2",name: "西城区",},{id: "1-3",name: "海淀区",children: [{id: "1-3-1",name: "北京大学",},{id: "1-3-2",name: "中关村",children: [{id: "1-3-2-1",name: "海淀黄庄",},],},],},{id: "1-4",name: "朝阳区",children: [{id: "1-4-1",name: "奥林匹克公园",},],},],
};
//非递归写法
function findAddressById(address, id) {if (address.id === id) {return address;}let queue = address.children ? address.children : [];while (queue.length > 0) {let ch = queue.shift();if (ch.id === id) {return ch;}if (ch.children) {queue = queue.concat(ch.children);}}return null;
}
//递归写法
function findAddressById(address, id) {if (address.id === id) {return address;}for (let i = 0; i < address?.children?.length; i++) {if (address.children[i].id === id) {return address.children[i];}let re = findAddressById(address.children[i], id);if (re) {return re;}}return null;
}
//let r = findAddressById(address, "1-3-1");
//console.log(r);
//       {
//          id: '1-3-1',
//          name: '北京大学',
//        }
  1. 动态规划问题

  2. 应用题

  • promise 并行数限制

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

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

相关文章

云手机助力舆情监测,智慧引领信息时代

随着信息时代的到来&#xff0c;舆情监测已成为政府、企业、高校、金融机构等各行业的必备利器。在这个信息爆炸的时代&#xff0c;如何及时准确地感知民意、把握市场动态&#xff0c;已成为各界迫切需要解决的问题。而云手机作为信息时代的新生力量&#xff0c;在舆情监测方面…

Python 数据结构和算法实用指南(四)

原文&#xff1a;zh.annas-archive.org/md5/66ae3d5970b9b38c5ad770b42fec806d 译者&#xff1a;飞龙 协议&#xff1a;CC BY-NC-SA 4.0 第十二章&#xff1a;字符串算法和技术 根据所解决的问题&#xff0c;有许多流行的字符串处理算法。然而&#xff0c;最重要、最流行和最有…

代码随想录阅读笔记-回溯【重新安排行程】

题目 给定一个机票的字符串二维数组 [from, to]&#xff0c;子数组中的两个成员分别表示飞机出发和降落的机场地点&#xff0c;对该行程进行重新规划排序。所有这些机票都属于一个从 JFK&#xff08;肯尼迪国际机场&#xff09;出发的先生&#xff0c;所以该行程必须从 JFK 开…

Python网络爬虫项目开发实战:如何处理动态内容

注意&#xff1a;本文的下载教程&#xff0c;与以下文章的思路有相同点&#xff0c;也有不同点&#xff0c;最终目标只是让读者从多维度去熟练掌握本知识点。 下载教程&#xff1a;Python网络爬虫项目开发实战_动态内容_编程案例解析实例详解课程教程.pdf Python网络爬虫项目开…

【1569】jsp学生学籍管理系统Myeclipse开发sqlserver数据库web结构jsp编程计算机网页项目

一、源码特点 jsp 学生学籍管理系统是一套完善的java web信息管理系统&#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。开发环境为TOMCAT7.0,Myeclipse8.5开发&#xff0c;数据库为sqlserver2…

2022 E3 算法题第二题(Maximum Sum of Two Integers in Aarray)

题目内容 There is an array A consisting of N integers. What is the maximum sum of two integers from A that share their first and last digits? For example, 1007 and 167 share their first (1) and last (7) digits, whereas 2002 and 55 do not.Write a function:…

代码托管(二)git(1)介绍

一、git相关 git github gitlub 二、gitlub签名认证 使用ssh克隆代码&#xff0c;使用gpg签名提交代码。 1、ssh签名 一对公钥和密钥&#xff0c;公钥复制到gitlub上。步骤如下 1.1、先在本地生成密钥和公钥 &#xff08;1&#xff09;配置用户名和邮箱 git config --g…

B3756 幸运数字

题目描述: 如果⼀个正整数 &#x1d45b;n 在五进制、七进制、九进制的表⽰下都没有数字 00&#xff0c;我们就称 &#x1d45b;n 是幸运数字。例如&#xff1a; (987)10(12422)5(2610)7(1316)9&#xff0c;因此 &#x1d45b;987不是幸运数字。 (988)10(12423)5(2611)7(1317…

深度学习基础——卷积神经网络的基础模块

深度学习基础——卷积神经网络的基础模块 卷积神经网络&#xff08;Convolutional Neural Networks&#xff0c;CNN&#xff09;是深度学习中一种非常重要的神经网络结构&#xff0c;它在图像识别、图像分类、目标检测等领域取得了巨大成功。本文将介绍卷积神经网络的几个基础…

MYSQL之增删改查(中)

前言&#xff1a; 以下是MySQL最基本的增删改查语句&#xff0c;很多IT工作者都必须要会的命令&#xff0c;也 是IT行业面试最常考的知识点&#xff0c;由于是入门级基础命令&#xff0c;所有所有操作都建立在单表 上&#xff0c;未涉及多表操作。 4、“查”——之单表查询 My…

Gamba:将高斯溅射与Mamba结合用于单视图3D重建

Gamba: Marry Gaussian Splatting with Mamba for Single-View 3D Reconstruction Gamba&#xff1a;将高斯溅射与Mamba结合用于单视图3D重建 Qiuhong Shen11  Xuanyu Yi31 Zike Wu31  Pan Zhou2,42 Hanwang Zhang3,5 沈秋红 1 易轩宇 3 吴子可 3 潘周 2,4 2 张汉旺 3,5Shu…

C++11 新特性:多线程支持 - std::recursive_timed_mutex

std::recursive_timed_mutex允许同一线程多次获取锁&#xff0c;并提供了超时功能。 这种锁特别适合用在递归函数中&#xff0c;或者当一个操作可能在同一线程内多次尝试获取同一锁时使用。 与std::timed_mutex一样&#xff0c;std::recursive_timed_mutex也提供了try_lock_f…

C语言开源库iniparser解析ini文件

1 ini文件介绍 INI&#xff08;Initialization File&#xff09;文件是一种简单直观的数据存储格式&#xff0c;常用于配置应用程序的初始化设置。这种文件通常包含若干个节&#xff08;section&#xff09;和键值对&#xff08;key-value pairs&#xff09;。INI文件的每一部…

Spring AOP(面向切面编程)

1.Spring AOP 简介 1.1 AOP概述 AOP 为 Aspect Oriented Programming 的缩写&#xff0c;意思为面向切面编程, 是通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术。AOP 是 OOP 的延续&#xff0c;是Spring框架中的一个重要内容&#xff0c;是函数式编程的一…

FPGA Quartus IP核 打开使用

两种Quartus版本下的IP核&#xff0c;从使用者的角度来看仅仅是配置界面不同&#xff0c;在参数设置和使用方法上基本一致。本文以“MegaWizard Plug-In Manager”中的FIR Compiler IP核使用为例。 Quartus的FIR IP核属于收费IP&#xff0c;如果是个人学习使用需要对IP核单独破…

linux设备树-of_parse_phandle_with_args

1.设备树实例 interrupt-controller1 { compatible "vendor,gic"; #interrupt-cells <2>; interrupt-controller; reg <0x01 0x1000>; }; deviceA { compatible "vendor,device-a"; reg <0x02 0x100>; interrupts <&interr…

C++ 深入理解 继承

本篇文章将谈谈一下几个问题&#xff1a; 1.基类和派生类对象赋值转换 2.继承中的作用域 3.派生类的默认成员函数 4.复杂的菱形继承及菱形虚拟继承 5.其他 1.基类和派生类对象赋值转换 1.派生类对象 可以赋值给 基类的对象 / 基类的指针 / 基类的引用。这里有个形象的说法叫切…

【电控笔记2.5】位置闭环回路设计

总结 List item 位置控制器 加入前馈 总结

SpringBoot基于JavaWeb的菜鸟驿站快递管理系统ssm

前端&#xff1a;vue.jsElementUI 编程语言: java 框架&#xff1a; ssm/springboot 详细技术&#xff1a;springboot springbootvueMYSQLMAVEN 数据库: mysql5.7 数据库工具&#xff1a;Navicat/SQLyog都可以 ide工具&#xff1a;IDEA 或者eclipse 对菜鸟驿站快递管理系统设计…

会议文字记录工具【钉钉闪记】

当开会时&#xff0c;需要文字记录会议内容&#xff0c;但是打字又慢&#xff0c;可以使用钉钉闪记。 钉钉工作台直接搜索-钉钉闪记