如何深入理解JavaScript中的递归

javascript中的递归就是指函数反复调用自己的过程,函数的调用是建立在堆栈中,在堆栈的顶部函数调用总是第一个弹出的。我们可以通过浏览器自带的开发工具来查看堆栈的调用

真正的理解JavaScript 中的递归是非常困难的,有的人甚至把它称为不必要的内存密集型和复杂版本的“for循环”。接下来将在文章中为大家详细介绍这个知识,希望对大家有所帮助。

如何深入理解JavaScript中的递归

【推荐课程:JavaScript教程】

编程中的递归是什么?

实质上, 递归是指函数或子例程反复调用自己的时候。所有递归函数调用都必须有一个基本情况。基本情况是让函数返回值而不是再次调用自身的特定条件。为了防止递归函数无限调用自身, 必须存在基本情况。如果省略或写入不正确, 就会出现错误。

立即学习“Java免费学习笔记(深入)”;

不正确的基本情况指的是一个基本情况它不包括所有可能的用户输入, 这可能会导致因通过基本情况的特定输入而导致无休止的递归函数的调用, 从而导致调用堆栈溢出。

函数调用存储在调用堆栈上

函数的调用都是存储在堆栈中,调用堆栈是堆栈数据结构的特定实现。它是一个 LIFO (最后进入, 首先输出) 数据结构, 这就意味着放置在堆栈顶部的函数调用是第一个弹出的。

例:计算5的阶乘

 function factorial(num) {    var nextNum = num - 1;    if (num === 1) {        return num;     }    return num * factorial(nextNum);}console.log(factorial(5));

登录后复制

输出结果为:120

上述代码中,当解析到console.log(factorial(5));时,首先console.log()将被推送到堆栈上,之后factorial(5) 其结果将传递到console.log()函数中,当我们输入factorial(5)时, 调用堆栈将如下所示

如何深入理解JavaScript中的递归

语句return num * factorial(nextNum);表示阶乘函数返回num (本例中表示5) 乘以递归函数调用的返回值, 其中4被传入。实质上, 该函数返回以下值

return 5 * factorial(4);

登录后复制

因为factorial(4)是一个函数, 所以我们将把这个函数调用推送到调用堆栈上。现在我们将重复相同的过程, 直到我们到达基本情况 i. 当num等于1时。此时, 调用堆栈将如下所示。

如何深入理解JavaScript中的递归

一旦我们到达基本情况, 函数factorial(1)返回值1。因此现在我们知道factorial(1)等于 1, factorial(2) ) 也返回一个非函数值: 2 * factorial(1) , 即 2 * 1 = 2。

接着, factorial(3)返回3 * factorial(2), 等于6。等等, 直到我们得到factorial(5), 它返回 5 * 24 = 120。

如何查看调用堆栈

如果使用的是 chrome web 浏览器,可按 f12 (在 Windows 上), 打开chrome 开发人员工具。在顶部选项卡上, 您将看到菜单标签, 如元素、配置文件、控制台、网络、源等。单击”源”。如下所示

未标题-2.jpg

通过该开发工具可以直观地查看调用堆栈。当递归函数调用num === 1的条件时, 它将返回1。之后, 当函数调用返回时, 每个阶乘函数调用都将从堆栈中弹出。

总结:以上就是本篇文章的全部内容了,希望对大家有所帮助。

以上就是如何深入理解JavaScript中的递归的详细内容,更多请关注【创想鸟】其它相关文章!

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

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

(0)
上一篇 2025年3月8日 00:26:47
下一篇 2025年3月5日 15:23:38

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

相关推荐

  • JavaScript中var,let与const之间有什么区别

    var,let和const的区别在于:var的变量声明在代码执行前且工作范围在当前执行的上下文中,let是允许创建一个变量但只作用在它的块里,const与let什么相似唯一的差别是const定义的变量不可更改 本篇文章主要是通过在JavaS…

    2025年3月8日
    200
  • JavaScript中Object.is()方法如何使用?(代码示例)

    在javascript中,object.is()方法可以用于确定两个值是否相同。下面本篇文章就来给大家介绍一下javascript object.is()方法怎么用,了解object.is()方法和==运算符之间的区别,希望对大家有所帮助。…

    2025年3月8日 编程技术
    200
  • Props属性如何设置

    Props(属性) 是组件自身的属性,props中的属性与组件属性一一对应。负责传递信息 1、父组件向子组件传递数据 //定义webName组件,负责输出名字var webName = React.createClass({  render…

    2025年3月8日
    200
  • Three.js是什么?

    three.js就是一个让webgl更加容易实现的javascript库,通过它实现3d效果可以简化代码的复杂度,另外所有支持webgl的都支持它,并且可在本地环境下运行。 WebGL是浏览器中实现三维效果的一套规范,随着WebGL开源框架…

    2025年3月8日
    200
  • p5.j​​s是什么?

    p5.js是一个用于创造性编码的javascript库。它是以processing 为基础的,是一种创造性的编码环境。它最初是由ben fry和casey reas开发的。processing 的主要重点是使初学者尽可能容易地学习如何编写交…

    2025年3月8日
    200
  • 企业应用钉钉免钉流程(附代码)

    本篇文章的主要内容是企业应用钉钉的免钉流程介绍,感兴趣的朋友可以了解一下,希望能够对你有所帮助。 大概流程如下: 1、注册账号和创建第三方应用:该过程直接按照提示流程操作即可,略过 2、获取corpID、corpSecret、agentID…

    2025年3月8日
    200
  • myeclipse怎么导入项目?

    进入myeclipse菜单栏点击file,选择import,弹出界面上点开general文件夹,再选中existing projects into workspace点next进入。点browse…,选中项目所在文件夹,再选择要…

    2025年3月8日 编程技术
    200
  • JavaScript中substr()和substring()之间的区别是什么?

    在javascript中,substr()和substring()函数都用于获取字符串的指定部分,但它们之间存在细微差别。下面本篇文章就来给大家介绍一下substr()和substring()函数,让大家了解substr()和substri…

    2025年3月8日
    200
  • ajax能做什么?

    Ajax 即“Asynchronous Javascript And XML”(异步 JavaScript 和 XML),是指一种创建交互式网页应用的网页开发技术。 Ajax = 异步 JavaScript 和 XML 或者是 HTML(标…

    2025年3月8日
    200
  • js文件是什么?怎么打开js文件?

    js文件是指包含JavaScript代码,以“.js”为扩展名的文本文档,用于在网页中执行JavaScript指令;双击启动js文件,如果文件关联设置正确,那么就可以直接使用与其相关联的软件打开它。 JS是javascript是缩写,js是…

    2025年3月8日 编程技术
    200

发表回复

登录后才能评论