让我们了解 JS 中的递归:类型、时间复杂度

目录

什么是递归?头递归尾递归树递归间接递归

什么是递归?

函数调用自身的过程称为递归,负责的函数称为递归函数。

递归类型:
从高层次来看,有四种类型

头递归: 在这里,递归函数在检查基本条件之后和执行任何逻辑之前立即调用自身。

function getsquares(n){    if(n>0){       getsquares(n-1);       console.log(n*n);       return;    }    }getsquares(3)

登录后复制

n = 3 的输出是:1 4 9

如果您注意到了,我们正在打印数字的平方,然后通过将数字减 1 来调用该函数。

因此您将按升序排列所有方块。

但是,如果您为尾递归编写相同的逻辑,您将按降序获得输出。上述代码的时间复杂度将是 o(n+1)o(n).

尾递归:递归函数调用自身和结束,即执行完所有逻辑后。

function getsquares(n) {    if (n == 0)        return;    print(n * n);    getsquares(n - 1);}getsquares(3)

登录后复制

n=3 的输出是: 9 4 1

时间复杂度是o(n+1)o(n).

树递归:递归函数在同一条件下多次调用自身。

让我们了解 JS 中的递归:类型、时间复杂度

function dosomething(n) {    if (n <= 2)        return n;    return dosomething(n - 1) + dosomething(n - 2);}console.log(dosomething(5))

登录后复制

n=5 的输出是:8

如果您在图中注意到,我们以树状格式调用 self 函数,这就是为什么我们称这种类型为树递归.

时间复杂度为 o(2^(n+1)+1)o(2^n).

间接递归 :递归函数a调用递归函数b,函数b调用递归函数a。所以,你就明白为什么我们称之为间接递归了。

function doSomethingA(n) {    if (n <= 2)        return n;    return doSomethingB(n - 1)}function doSomethingB(n) {    if (n <= 2)        return n;    return doSomethingA(n - 1)}console.log(doSomethingA(5))

登录后复制

n=5 的输出是:2

说实话,这个例子没有太多逻辑,我举这个例子只是为了向你解释这个概念。

如果您注意到我们正在调用 dosomethinga() 并且 dosomethinga 正在调用 dosomethingb() 函数,并且进一步 dosomethingb 正在调用 dosomethinga() 函数。

这种类型的递归调用称为间接递归。

问你的问题:
尝试计算间接递归的时间复杂度。如果您有任何疑问或者不明白的地方,可以通过写评论来询问,我会尽力通过解释来解决。

以上就是让我们了解 JS 中的递归:类型、时间复杂度的详细内容,更多请关注【创想鸟】其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至253000106@qq.com举报,一经查实,本站将立刻删除。

发布者:PHP中文网,转转请注明出处:https://www.chuangxiangniao.com/p/2670850.html

(0)
上一篇 2025年3月7日 13:03:40
下一篇 2025年3月7日 13:03:48

AD推荐 黄金广告位招租... 更多推荐

相关推荐

  • 免费接龙

    很久以前,在同一个星系中,我开始尝试制作 freecell,作为学习 angular 1.3 的一种方式。 我已经走了这么远,然后我就被其他事情分散了注意力,就像副项目一样。 我最近有一些空闲时间(我知道,我也没想到),所以我想我应该再试一…

    2025年3月7日
    200
  • 使用 Remotion、Nextjs 和 Tailwind CSS 构建基于 Web 的视频编辑器

    如果您曾经想创建自己的强大的基于网络的视频编辑器(类似于 veed.io 或 descript 等流行工具),那么您来对地方了!在本分步指南中,我们将向您展示如何使用 remotion、next.js 和 tailwind css 构建视频…

    2025年3月7日
    200
  • JavaScript 中的 SET(初学者教程)

    你好, 您是否正在寻找一种存储唯一值、允许插入值、查找值总数和删除值的数据结构?套装是最佳选择。许多编程语言都包含内置的 set 数据结构,javascript 也不例外。让我们更深入地了解集合的工作原理。 设置是什么? ​​set 是一种…

    2025年3月7日
    200
  • + React 现代商店的电子商务组件

    想要使用 react 和 tailwind css 构建一个电子商务网站?您来对地方了! tailgrids 提供了一套全面的react 电子商务组件,旨在简化您的开发流程并增强您的在线商店。 TailGrids 拥有超过 100 多个电子…

    2025年3月7日
    200
  • 揭示算法和数据结构:高效编程的基础

    在这一系列文章中,我将分享我的学习历程,涉及在学术环境和大型科技公司中广泛讨论的两个主题:算法和数据结构。虽然这些主题乍一看似乎令人畏惧,特别是对于像我这样由于其他职业挑战而在整个职业生涯中没有机会深入研究这些主题的人,但我的目标是让它们变…

    2025年3月7日
    200
  • 补充您的税务工作流程的工具

    税务专业人士经常争分夺秒地浏览大量表格、数字和无尽的计算。报税季感觉像是一场生死攸关的高风险冒险,毕竟确实如此。 但不要害怕。您可以为自己配备最新、最好的税务软件工具,借助工作流程管理软件和一些基本工具,轻松克服税务工作流程和文件申报表的复…

    2025年3月7日
    200
  • 为初学者回顾一下使用 JavaScript 的排序算法的亮点

    排序算法是用于按特定顺序(通常是数字顺序或字典顺序)排列列表或数组元素的方法。它们是计算机科学中有效组织数据的基础。这是理解如何将问题分解为步骤然后实现这些步骤的练习,即如何创建算法。这也是一种认识到解决问题的方法有多种,并且有些方法优于其…

    2025年3月7日
    200
  • extjs API 查询参数示例

    api 查询 参数是附加到 api 请求的 url 的键值对,用于向服务器发送附加信息。它们允许客户端(例如网络浏览器或应用程序)在向服务器发出请求时指定某些条件或传递数据。 查询参数添加到 url 末尾的问号 (?) 后面。每个参数都是一…

    2025年3月7日
    200
  • js如何排版

    JavaScript 提供了多种方法进行排版:文本格式化:使用 createElement() 创建元素,设置 innerHTML/textContent,使用 style.property 设置样式,使用 classList 管理类。元素…

    2025年3月7日
    200
  • js如何防混淆

    为了防止 JavaScript 混淆,可实施以下策略:将代码拆分为较小模块。使用随机变量和函数名称。混淆字符串。使用代码混淆引擎。开发自定义混淆器。使用具有内置反混淆功能的框架。定期更新代码库。 JavaScript 防混淆 引言 Java…

    2025年3月7日
    200

发表回复

登录后才能评论