写点东西《JavaScript 中的递归》

写点东西《JavaScript 中的递归》

  • 您是否曾经发现自己需要在 JavaScript 中循环遍历一个复杂的多维对象,却不知道如何操作?
  • 那么,递归函数到底是什么?
  • 让我们回到我们的树对象。
  • 为什么使用递归
  • 🌟更多精彩

在这里插入图片描述

您是否曾经发现自己需要在 JavaScript 中循环遍历一个复杂的多维对象,却不知道如何操作?

如果是这样,您应该考虑使用搜索引擎作为查找解决方案的强大工具。但是,既然您已经在这里,如果您继续阅读,您就会找到解决此问题的优雅解决方案。

让我们以以下树为例开始。

const mySuperComplexTree = {name: "root",children: [{name: "child-1",children: [{name: "child-1-1",children: [{name: "child-1-1-1",children: []}]}]},{name: "child-2",children: []}]
};

问题:您必须将每个节点名称(包括根节点)打印到控制台。

当我们第一次遇到这类问题时,我们倾向于被邓宁-克鲁格效应所误导,并认为可以用一个简单的 for 循环来解决。简短的回答是肯定的……但同样,那并不总是最好的方法。

让我们看看当我们遵循这种方法时会发生什么:

console.log(mySuperComplexTree.name);
for (const node of mySuperComplexTree.children) {console.log(node.name);for (const node2 of node.children) {console.log(node2.name);for (const node3 of node2.children) {console.log(node3.name);}}
}// Output:
// root
// child-1
// child-1-1
// child-1-1-1
// child-2

GIF

Alt Google

正如您可能看到的,即使它起作用了,此解决方案也存在几个问题:

  1. 首先,它不容易阅读。没有人想在他们的代码中看到一堆嵌套循环,而且你是团队成员,对吧?
  2. 如果这棵树在运行时需要发生变化,会发生什么?当前的实现不是动态的,因此您必须修改代码并手动添加更多嵌套循环。这会使代码更难阅读且更难维护。

**
这就是递归派上用场的地方。**

那么,递归函数到底是什么?

GIF

Alt Recursion

它是一个在执行期间调用自身的函数。此特性允许它用于解决可以分解为与整体问题相同的更小、更简单的子问题的问题。

一个简单的方法是使用递归来实现倒计时功能。让我们看看。

function countDownFrom(n) {if (n < 0) return;console.log(n);countDownFrom(n - 1);
}
countDownFrom(10);

在此示例中, countDownFrom 函数打印一个数字,然后使用您传递的数字(减一)调用自身(递归),重复此过程,直到达到基本情况(在本例中,当 n 小于 0 时)。

正如你所见,它基本上是一个循环,但更简单、更优雅。

让我们回到我们的树对象。

我们的初始问题是,我们需要打印树的所有节点名称,我们将使用递归来解决它,因为我们注意到我们的树具有一个常量结构,其中每个节点都有一个 name 属性(我们要打印的字符串)和一个 children 属性(一个节点数组)。

因此,我们的函数需要接收一个节点并打印其名称,然后由于所有子节点都是相似的,我们可以循环一次子节点并仅调用传递子节点的相同函数。这将接收一个母鹿,打印其名称并重复该过程。

function printNodeNames(tree) {console.log(tree.name);for (const node of tree.children) {printNodeNames(node);}
}printNodeNames(mySuperComplexTree);// Output:
// root
// child-1
// child-1-1
// child-1-1-1
// child-2

正如您所见, printNodeNames 函数解决了我们的初始问题。

它首先打印当前节点的名称(作为参数传递)。然后,它循环遍历当前节点的子节点数组,并针对每个子节点调用自身(再次递归),将子节点作为新参数传递。此过程一直持续到它打印树中的所有节点名称。这正是我们所说的我们需要的东西。

此函数演示了遍历树结构的常见模式:处理当前节点(在本例中,打印其名称),然后递归处理所有子节点。

这种技术被称为深度优先遍历,因为它在回溯之前尽可能深入树中。

为什么使用递归

如果您出于某种原因尚未被说服使用递归函数,我将为您提供四个递归函数如此有用的原因。

  1. 简单性:递归通常比其迭代对应项(for、while 等)更容易理解。它们可以将复杂的任务变成更简单的任务。
  2. 问题解决:有些问题本质上是递归的,例如树遍历、河内塔等。对于此类问题,使用递归函数更容易。
  3. 分而治之:递归函数允许您将较大的问题分解为较小、更易于管理的子问题。这是许多高效算法(如归并排序和快速排序)的基础。
  4. 更少的代码:递归函数可以减少代码量。好的,更短的代码并不一定意味着更好,但它可以使代码更具可读性。

总之,递归不仅是某些问题的优雅解决方案,而且是将任务分解为更小任务(例如遍历树或对列表进行排序)的强大且有用的工具。

它们的关键组件是基本情况(函数停止调用自身的情况)和递归情况(函数调用自身的部分)。

但是,与迭代解决方案相比,它们可能更难理解和调试,并且如果未仔细实现,还可能导致堆栈溢出等性能问题。因此,谨慎使用递归并确保始终可以访问基本情况非常重要。


🌟更多精彩

点击👉这里~~

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

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

相关文章

LabVIEW工业机器人系统

介绍了ABB工业机器人与LabVIEW之间进行数据交互的解决方案。通过使用TCP/IP协议的socket通信&#xff0c;实现了机器人坐标数据的读取&#xff0c;为人机交互提供了一个更便捷、更高效的新思路。 系统主要由ABB工业机器人、基于TCP/IP协议的通信接口和LabVIEW软件组成。工业机…

鸿蒙常用UI效果及一些处理方式总结

前言&#xff1a; DevEco Studio版本&#xff1a;4.0.0.600 详细使用介绍 1、Text的一些常用设置 Text(this.message).fontSize(50)//字体大小.fontColor(Color.White)//字体颜色.fontWeight(FontWeight.Bold)//字体加粗.backgroundColor(Color.Black)//背景颜色.fontStyle(…

[安全警报] Npm木马利用“Oscompatible“包悄然安装AnyDesk

最近&#xff0c;一个名为OsCompatible的恶意包被上传到npm 。该包被发现包含一个针对 Windows 的远程访问木马。 这个名为OsCompatible的软件包于2024年1月9日发布&#xff0c;在被撤下之前共吸引了380次下载。 据了解&#xff0c;OsCompatible包含“几个奇怪的二进制文件”…

Linux本地部署MeterSphere测试平台并实现公网远程访问

文章目录 前言1. 安装MeterSphere2. 本地访问MeterSphere3. 安装 cpolar内网穿透软件4. 配置MeterSphere公网访问地址5. 公网远程访问MeterSphere6. 固定MeterSphere公网地址 前言 MeterSphere 是一站式开源持续测试平台, 涵盖测试跟踪、接口测试、UI 测试和性能测试等功能&am…

重学JavaScript高级(十五): XHR以及Fetch的理解应用

JavaScript XHR、Fetch 服务器端渲染-前后端分离 **服务器端渲染&#xff1a;**将html文件在后端&#xff0c;拼接好&#xff0c;将整个文件全部返回给前端 随着目前业务逻辑的复杂度提升&#xff0c;这种开发模式&#xff0c;会导致效率低下同时&#xff0c;有时候前端页面仅…

SQL语句 - 查询语句

Data Query Language 文章目录 Data Query Language数据查询&#xff08;DQL&#xff09;基础查询1 基本查询2 排序查询3 条件查询4 分支结构查询5 查询函数6 分组查询7 分组过滤查询8 限定查询9 基础查询总结 面试题&#xff1a;一条SQL查询语句的执行流程高级查询1 子查询2 合…

linux基础学习(7):find命令

1.按照文件名搜索 find 搜索路径 选项 文件名 选项&#xff1a; -name&#xff1a;按文件名搜索 -ineme&#xff1a;不区分文件名大小写搜索 -inum&#xff1a;按inode号搜索 按文件名搜索跟按关键词搜索不一样&#xff0c;只能搜到文件名完整对应的文件 *根据文件名…

电磁波的空间辐射的几种传输形式

一般来说&#xff0c;波的传播方式与波长有关&#xff0c;如低频段的地波传播&#xff0c;极低频段的地—电离层波导传播&#xff0c;短波段的天波传播&#xff0c;甚高频&#xff0c;超高频的直线传播和散射传播方式等。绕射和透射是电磁波传输特性与环境的关系&#xff0c;属…

利用 Token Explorer 信号驾驭市场波动

市场波动使加密货币投资组合面临风险&#xff0c;但是通过 Token Explorer 分析&#xff0c;我们可以对波动进行建模&#xff0c;提前预测市场风险&#xff0c;并找到最安全的投资策略。通过综合考虑 Token 价格、交易量、社交媒体信息和链上交易等各种数据&#xff0c;我们可以…

【转载】linux摄像头驱动

Linux摄像头驱动学习第一篇&#xff0c;对虚拟视频驱动Virtual Video Driver(vivid)进行测试、分析、编写。 V4L2(Video for Linux two)是Linux内核中关于视频设备的内核驱动框架&#xff0c;为上层的访问底层的视频设备提供了统一的接口。 V4L2可以支持多种设备,它可以有以下…

【进入游戏行业选游戏特效还是技术美术?】

进入游戏行业选游戏特效还是技术美术&#xff1f; 游戏行业正处于蓬勃发展的黄金时期&#xff0c;科技的进步推动了游戏技术和视觉艺术的飞速革新。在这个创意和技术挑战交织的领域里&#xff0c;游戏特效和技术美术岗位成为了许多人追求的职业目标。 这两个岗位虽然紧密关联…

开始读 Oracle PL/SQL Programming 第6版

最近觉得PL/SQL越来越重要&#xff0c;因为这本书早就在待读列表中&#xff0c;因此决定系统的学一下。 2024年1月24日晚开始读。 在亚马逊上的评价还不错&#xff1a; 本书的第一作者是Steven Feuerstein&#xff0c;是Oracle资深的Developer Advocate。 本书的示例代码可…

如何实现激光雷达运动补偿,这篇就够了

目录 激光雷达为什么会存在运动畸变 激光雷达如何运动去畸变 C++实践激光雷达运动补偿(辅助传感器) 实践激光雷达ICP运动补偿 参考文献 激光雷达为什么会存在运动畸变 首先要理解为什么会产生运动畸变。激光雷达扫描物体形成点云的过程自身伴随着旋转运动,每次激…

城市开发区视频系统建设方案:打造视频基座、加强图像数据治理

一、背景需求 随着城市建设的步伐日益加快&#xff0c;开发区已经成为了我国工业化、城镇化和对外开放的重要载体。自贸区、开发区和产业园的管理工作自然也变得至关重要。在城市经开区的展览展示馆、进出口商品展示交易中心等地&#xff0c;数千路监控摄像头遍布各角落&#…

面试常问的Spring AOP底层原理

AOP底层原理可以划分成四个阶段&#xff1a;创建代理对象阶段、拦截目标对象阶段、调用代理对象阶段、调用目标对象阶段 第一阶段&#xff1a;创建代理对象阶段 通过getBean&#xff08;&#xff09;方法创建Bean实例根据AOP的配置匹配目标类的类名&#xff0c;判断是否满足切…

Termux结合内网穿透实现无公网ip远程SFTP传输文件

目录 前言 1. 安装openSSH 2. 安装cpolar 3. 远程SFTP连接配置 4. 远程SFTP访问 4. 配置固定远程连接地址 结语 作者简介&#xff1a; 懒大王敲代码&#xff0c;计算机专业应届生 今天给大家聊聊Termux结合内网穿透实现无公网ip远程SFTP传输文件&#xff0c;希望大家能…

RisingWave 存储引擎优化:更高的性能与更低的成本

1背景 在「Hummock &#xff1a;专为 RisingWave 流处理而设计的云原生存储引擎」一文中里我们已经介绍了 Hummock 的设计理念与基本架构&#xff0c;本文主要介绍 Hummock 近期几个版本的重大改进与优化 2Fast Compaction 在设计之初&#xff0c;Hummock 的数据文件格式参…

统计linux cpu已使用核心数目

查看cpu核心数 nproc 统计cpu负载 os.getoadavg() 15.09: 过去 1 分钟的平均负载。15.17: 过去 5 分钟的平均负载。15.74: 过去 15 分钟的平均负载。 这些数字表示系统在过去一段时间内的平均负载。平均负载是指在系统中运行或等待运行的进程数。通常&#xff0c;如果这些…

WinSCP如何使用公网TCP地址访问本地服务器

文章目录 1. 简介2. 软件下载安装&#xff1a;3. SSH链接服务器4. WinSCP使用公网TCP地址链接本地服务器5. WinSCP使用固定公网TCP地址访问服务器 1. 简介 ​ Winscp是一个支持SSH(Secure SHell)的可视化SCP(Secure Copy)文件传输软件&#xff0c;它的主要功能是在本地与远程计…

【pytorch框架】使用 PyTorch 进行深度学习

1.Pytorch介绍 PyTorch 是由 Facebook 创建和发布的用于深度学习计算的 Python 库。它起源于早期的库 Torch 7&#xff0c;但完全重写。 它是两个最受欢迎的深度学习库之一。PyTorch 是一个完整的库&#xff0c;能够训练深度学习模型以及在推理模式下运行模型&#xff0c;并支…