写点东西《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. 更少的代码:递归函数可以减少代码量。好的,更短的代码并不一定意味着更好,但它可以使代码更具可读性。

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

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

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


🌟更多精彩

点击👉这里~~

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【前端web入门第二天】01 html语法实现列表与表格

html语法实现列表与表格 文章目录: 1.列表 1.1 无序列表1.2 有序列表1.3 定义列表 2.表格 2.1 表格基本结构2.2 表格结构标签 写在最前,第二天学习目标: 列表 表格 表单 元素为嵌套关系 1.列表 作用:布局内容排列整齐的区域。 列表分类:无序列表、有序列表、定义列表。 1…

动态规划算法题刷题笔记

首先看动态规划的三要素&#xff1a;重叠子问题、最优子结构和状态转移方程。 重叠子问题&#xff1a;存在大量的重复计算 最优子结构&#xff1a; 状态转移方程&#xff1a;当前状态转移成以前的状态 动态规划的解题步骤主要有&#xff1a; 确定 dp 数组以及下标的含义状…

HTML新手教程

HTML入门 教程&#xff1a;【狂神说Java】HTML5完整教学通俗易懂_哔哩哔哩_bilibili 一.初识HTML HyperTextMarkupLanguage&#xff08;超文本标记语言&#xff09; 超文本包括&#xff1a;文字、图片、音频、视频、动画。 HTML5的优势 世界知名浏览器厂商对HTML5的支持市场的…

Spring: alibaba代码规范校验工具checkstyle

文章目录 一、idea配置checkstyle插件二、激活CheckStyle三、配置自动格式化功能四、使用代码格式化 一、idea配置checkstyle插件 下载 Intellij IDEA Checkstyle 插件&#xff1a;File -> setting -> plugin通过关键字CheckStyle-IDEA搜索并安装。 安裝完成后重启idea…

【复现】万户ezoffice协同管理平台 任意文件读取漏洞_30

目录 一.概述 二 .漏洞影响 三.漏洞复现 1. 漏洞一&#xff1a; 四.修复建议&#xff1a; 五. 搜索语法&#xff1a; 六.免责声明 一.概述 万户ezOFFICE协同管理平台分为企业版和政务版。 解决方案由五大应用、两个支撑平台组成&#xff0c;分别为知识管理、工作流程、沟…

Linux cat,tac,more,head,tail命令 查看文本

目录 一. cat 和 tac命令二. head 和 tail 命令三. more命令 一. cat 和 tac命令 cat&#xff1a;用来打开文本文件&#xff0c;从上到下的顺序显示文件内容。tac&#xff1a;用法和cat相同&#xff0c;只不过是从下到上逆序的方式显示文件内容。当文件的内容有很多的时候&…

LiveGBS流媒体平台GB/T28181常见问题-如何快速查看推流上来的摄像头并停止摄像头推流?

LiveGBS流媒体平台GB/T28181常见问题-如何快速查看推流上来的摄像头并停止摄像头推流&#xff1f; 1、负载信息2、负载信息说明3、会话列表查看3.1、会话列表 4、停止会话5、搭建GB28181视频直播平台 1、负载信息 实时展示直播、回放、播放、录像、H265、级联等使用数目 2、负…

Linux下的进程操作

进程概念 ps -elf&#xff1a;查看操作系统的所有进程&#xff08;Linux命令&#xff09; ctrl z&#xff1a;把进程切换到后台 crtl c&#xff1a;结束进程 fg&#xff1a;把进程切换到前台 获取进程进程号和父进程号 函数原型&#xff1a; pid_t getpid(void); //pid_t…

【阻塞队列】阻塞队列的模拟实现及在生产者和消费者模型上的应用

文章目录 &#x1f4c4;前言一. 阻塞队列初了解&#x1f346;1. 什么是阻塞队列&#xff1f;&#x1f345;2. 为什么使用阻塞队列&#xff1f;&#x1f966;3. Java标准库中阻塞队列的实现 二. 阻塞队列的模拟实现&#x1f35a;1. 实现普通队列&#x1f365;2. 实现队列的阻塞功…

美赛注意事项

2024年1月27日 &#xff1a; 赖维杰 同学分享 1、最后的展现必须要漂亮&#xff08;绘图、呈现&#xff09; 李维情 西北建模王 论文位&#xff08;核心&#xff09;必须清楚建模位、编程位知道做了些什么 常见模型&#xff1a; 1、看真题&#xff0c;读往年论文&#xff0c;选…

计算机找不到ucrtbased.dll无法运行程序,分享5种有效的解决方法

当计算机系统在运行过程中无法找到ucrtbased.dll这个特定的动态链接库文件时&#xff0c;可能会引发一系列的问题和故障现象。ucrtbased.dll是Windows操作系统中一个至关重要的组件&#xff0c;它包含了C运行时库的核心函数&#xff0c;对于许多应用程序特别是基于Microsoft Vi…

vue中的computed

目录 一&#xff1a;介绍 二&#xff1a;例子演示 一&#xff1a;介绍 在 Vue.js 中&#xff0c;computed 属性是一种特殊类型的属性&#xff0c;它允许你声明依赖于其他数据属性的值。computed 属性的值是通过一个函数计算得出的&#xff0c;这个函数可以在其依赖的数据发生…

【misc | CTF】攻防世界 适合作为桌面

天命&#xff1a;这题还挺繁琐的&#xff0c;知识点还不少 目录 步骤1&#xff1a;图片隐写 步骤2&#xff1a;Winhex查看ascii码 步骤1&#xff1a;图片隐写 拿到这张图片&#xff0c;不可能扔进ps会有多图层&#xff0c;普通图片也就一个图层而已 但居然可以有隐写图片这…

I/O多路复用

简介&#xff1a; I/O 多路复用(I/O 多路转接)使得程序能同时监听多个文件描述符&#xff0c;能够提高程序的性能&#xff0c;Linux 下实现 I/O 多路复用的系统调用主要有 select 、 poll 和 epoll 。 select &#xff1a; 主旨思想&#xff1a; 1. 首先要构造一个关于文…

查询排序(2)

Oracle从入门到总裁:https://blog.csdn.net/weixin_67859959/article/details/135209645 1.选择部门 30 中的所有员工 SQL> select *2 from emp3 where deptno 30;EMPNO ENAME JOB MGR HIREDATE SAL COMM …

《动手学深度学习(PyTorch版)》笔记2

Chapter2 Preliminaries 2.1 Automatic Differentiation 让计算机实现微分功能&#xff0c; 有以下四种方式&#xff1a; - 手工计算出微分&#xff0c; 然后编码进代码 - 数值微分 (numerical differentiation) - 符号微分 (symbolic differentiation) - 自动微分&#xff0…

搜维尔科技:【简报】元宇宙数字人赛道,《莉思菱娜》

个性有些古灵精怪时儿安静时而吵闹&#xff0c;虽然以人类寿命来算已经200多岁但在 吸血鬼中还只是个小毛头&#xff0c;从中学开始喜欢打扮偏爱黑白灰色系的服装喜欢时 尚圈&#xff0c;立志想成为美妆或时尚网红不过目前还是学生&#xff0c;脸上的浅色血迹是纹身 贴纸&#…

Javat集合之Lis---(ArrayList和LinkedList)

文章目录 一、 List概述1.1概念1.2list体系结构图1.3 通用方法测试代码 二、List的特点三、遍历方式foreachfor循环迭代器 四、ArrayListArrayList概述概念数据结构 ArrayList的特点 ArrayList去重字符串去重对象去重 五、LinkedListLinkedList概述概念数据结构LinkedList的特点…

一键轻松,免费创造:QuickQR带你体验AI二维码的轻松生成!

当今时代&#xff0c;将信息快速转变为可扫描图案&#xff0c;以简化人们的生活和工作方式&#xff0c;二维码技术展现了它强大的功能。特别是在分享链接、联系信息或进行支付时&#xff0c;二维码已成为现代社会一个不可或缺的部分。本文将探讨生成AI二维码的一种工具&#xf…

线性表--队列

1.什么是队列&#xff1f; 队列是只允许在一端进行插入数据操作&#xff0c;在另一端进行删除数据操作的特殊线性表&#xff0c;队列具有先 进先出FIFO(First In First Out) &#xff1b; 入队列&#xff1a;进行插入操作的一端称为队尾&#xff1b; 出队列&#xff1a;进行…