首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >JS/TS 中的递归

JS/TS 中的递归

原创
作者头像
zayyo
发布于 2023-11-29 13:31:14
发布于 2023-11-29 13:31:14
4480
举报
文章被收录于专栏:zayyo前端zayyo前端

什么是递归?

根据维基百科的定义,递归是这样描述的:

"递归通常用于描述以类似于已显示方式重复对象的过程。例如,当两面镜子相互对着时,产生的图像就是一个很好的例子。"

在 JavaScript/TypeScript 中呢?

在 JavaScript/TypeScript 中,递归是指函数或类型在满足特定条件之前重复调用自身,这可以出现在函数中,即递归函数调用,也可以出现在类型中。

示例

假设我们有一个包含文件(File)和文件夹(Folder)的数组,并且我们需要在控制台中显示每个文件(或文件夹)的名称:

首先,我们需要创建一个适用于我们递归函数的类型:

代码语言:typescript
AI代码解释
复制
type Item = {
  id: string
  name: string
  // 如果存在 children,那么这是一个文件夹(Folder),否则是文件(File)。
  children?: Item[]
}

正如您所见,我们使用了递归,因为我们将 children 的类型设置为 Item[],这意味着创建了一种递归、嵌套的结构。

接下来,我们的函数会是这样的:

代码语言:typescript
AI代码解释
复制
const showFileAndFolders = (items: Item[]) => {
  // 遍历所有项目。
  items.forEach(item => {

    // 如果存在 children,则为文件夹(Folder),否则为文件(File)。
    if (item.children) {
      // 是文件夹,显示名称并再次调用函数以处理 `children`。
      console.log('Folder: ', item.name)

      // 递归调用,函数内部再次调用自身。
      showFileAndFolders(item.children)

      return;
    } else {
      // 是文件,显示名称。
      console.log('File: ', item.name)
      return; 
    }
  })
}

其他示例

递归的常见应用也可见于以下情况:

斐波那契数列

代码语言:typescript
AI代码解释
复制
const generateFibonacci = (num: number) => {
  if (num <= 1) return n;
  return generateFibonacci(num - 1) + generateFibonacci(num - 2);
}

我正在参与2023腾讯技术创作特训营第三期有奖征文,组队打卡瓜分大奖!

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
2020-07_开发经验集
本文由来源 jackaroo2020,由 javajgs_com 整理编辑,其版权均为 jackaroo2020 所有,文章内容系作者个人观点,不代表 Java架构师必看 对观点赞同或支持。如需转载,请注明文章来源。
Java架构师必看
2021/03/22
4130
2020-07_开发经验集
浅析浏览器书签的导入和导出
浏览器有个实用的功能,但是可能用的频率不高,就是书签/收藏的导入和导出,因为现在一般浏览器都有云同步功能,所以这个功能存在感不强。
街角小林
2022/06/15
9680
浅析浏览器书签的导入和导出
通过el-tree自定义渲染网页版工作目录,实现鼠标悬浮显示完整名称、用icon区分文件和文件夹等需求
最近做项目时需要做一些云原生相关的内容,有个需求要在服务器上做临时文件夹作为工作目录,同时要将工作目录映射到docker image中和前端页面上。那么将服务器的本地工作目录渲染到前端页面上是必须要实现的部分,其中从后端API获取本地目录信息后,将数据渲染成自定义的前端工作目录是篇博客将要谈到的主要内容。
watermelo37
2025/01/22
1760
通过el-tree自定义渲染网页版工作目录,实现鼠标悬浮显示完整名称、用icon区分文件和文件夹等需求
node快速搭建一个学习资料共享平台
本文要实现的功能比较简单:1、将想要共享的文件分文件夹的组织起来;2、别人可以通过界面进行搜索;3、可以在线预览或下载文件。基于这样的需求,本文分享通过node如何实现这样的功能。
牛老师讲GIS
2023/10/23
1930
node快速搭建一个学习资料共享平台
JavaScript 设计模式学习第十六篇-组合模式
组合模式(Composite Pattern)又叫整体-部分模式,它允许你将对象组合成树形结构来表现整体-部分层次结构,让使用者可以以一致的方式处理组合对象以及部分对象。
越陌度阡
2020/11/26
4910
JavaScript 设计模式学习第十六篇-组合模式
[Part1]JavaScript生态加速攻略:一次一个库
该系列是由@marvinhagemeist撰写的,旨在通过一系列文章加速JavaScript生态系统。这些文章提供了有关如何加速JavaScript生态系统的有用信息。文章涵盖了各种主题,包括PostCSS、SVGO、模块解析、eslint和npm脚本。
前端小智@大迁世界
2023/05/23
3750
[Part1]JavaScript生态加速攻略:一次一个库
JavaScrip最容易犯的十大错误及其避免方法()
这可能由于许多原因而发生,但常见的是在呈现UI组件时不正确地初始化状态。 让我们看一个在真实应用程序中如何发生这种情况的示例。 我们将选择React,但不正确初始化的相同原则也适用于Angular,Vue或任何其他框架。
我只会写Bug啊
2023/12/25
3.8K0
JavaScrip最容易犯的十大错误及其避免方法()
1000多个项目中的十大JavaScript错误以及如何避免
通过统计数据库中的1000多个项目,我们发现在 JavaScript 中最常出现的错误有10个。下面会向大家介绍这些错误发生的原因以及如何防止。 对于这些错误发生的次数,我们是通过收集的数据统计得出的
葡萄城控件
2018/03/27
11K0
1000多个项目中的十大JavaScript错误以及如何避免
TS 从 0 到 1 - TypeScript 函数
# TypeScript 函数 与 JavaScript 函数区别 TypeScript JavaScript 含有类型 无类型 箭头函数 箭头函数 函数类型 无函数类型 必填和可选参数 所有参数都是可选的 默认参数 默认参数 剩余参数 剩余参数 函数重载 无函数重载 # 箭头函数 # 常见语法 myBooks.forEach(() => console.log('reading')); myBooks.forEach(book => console.log(book)); myBooks.forE
Cellinlab
2023/05/17
2870
JS 递归 数组嵌套回显
第一种: // 查询部门信息 seeBranch(data,id){ function find(data, fn, result) { data.forEach(item => { if(item.id===id){ result.push(item) }else if (item.children.length>0) { find(item.children, fn, result) } else { if (f
我不是费圆
2022/05/09
4.5K0
Vue 框架学习系列九:vue3高级组件模式
在Vue 3中,组件是构建复杂用户界面的基石。除了基本的组件使用方式外,Vue还提供了许多高级组件模式,帮助开发者构建更复杂、更可维护的应用程序。本文将深入探讨Vue 3中的几种高级组件模式,包括动态组件、<keep-alive>、Mixins以及递归组件。
china马斯克
2024/10/08
5200
前端工程师征服树形组件的秘籍
组件已经好了,如果我们要点击,我们怎么知道哪个层级的哪个节点被点了呢?是不是会写一个搜索算法,传入当前节点id,然后回溯去记录路径展示出来?这虽然可以做到,但显然是不优雅的,我们只需要牺牲空间换时间的方法就可以大大优化这个过程,即是在遍历的过程中把节点信息带到下一个递归函数里面去。
IMWeb前端团队
2019/12/04
1.1K0
提示
组件已经好了,如果我们要点击,我们怎么知道哪个层级的哪个节点被点了呢?是不是会写一个搜索算法,传入当前节点id,然后回溯去记录路径展示出来?这虽然可以做到,但显然是不优雅的,我们只需要牺牲空间换时间的方法就可以大大优化这个过程,即是在遍历的过程中把节点信息带到下一个递归函数里面去。
lhyt
2019/07/22
1.6K0
提示
根据用户权限过滤菜单
在 JavaScript 中,你可以使用 filter() 方法来根据用户权限过滤菜单。以下是一个示例:
挥刀北上
2024/11/28
2470
根据用户权限过滤菜单
1000多个项目中的十大JavaScript错误以及如何避免
通过统计数据库中的1000多个项目,我们发现在 JavaScript 中最常出现的错误有10个。下面会向大家介绍这些错误发生的原因以及如何防止。
一墨编程学习
2018/10/20
8.6K0
vue 递归组件
一、建一个.vue的子组件 <template> <ul> <slot name="title"></slot> <li v-for="(item,index) in treeData" :key="index"> <NavMenu :treeData = "item.children" v-if="item.children && item.children.length>0"> <template slot="title">
tianyawhl
2022/05/06
2930
关于VUE3+TS利用递归组件完成TreeList的设计与实现
虽然是标题党,但是不代表咱们的内容不真诚,如果对您各位有用,请不要吝啬您的小手,赞一赞!
用户7413032
2022/09/16
3.4K0
关于VUE3+TS利用递归组件完成TreeList的设计与实现
手把手教学拥有自己的CLI
因为我是前端 node对于我来说比较友好,node 环境电脑一般都有,写这种cli js其实是比较好的选择,灵活高效。但是我还是想用TS 🐶。
星宇大前端
2023/11/28
6640
手把手教学拥有自己的CLI
有趣的JS面试题,一起探讨一下吧
title: 有趣的JS面试题,一起探讨一下吧 subtitle: js-case date: 2018-08-02 09:12:22 tags: [web前端, js面试题, javascript, 面试题] categories: 面试 author: - Javan
Javanx
2019/09/04
5351
递归
递归:如果一个函数在内部可以调用其本身,那么这个函数就是递归函数。简单理解:函数内部自己调用自己, 这个函数就是递归函数
梨涡浅笑
2022/05/08
6520
相关推荐
2020-07_开发经验集
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档