JavaScript 进阶实战课
石川
JavaScript Patterns and Anti-Patterns 等开源项目创建者,O'Reilly 技术评审
15066 人已学习
新⼈⾸单¥59
登录后,你可以任选4讲全文学习
课程目录
已完结/共 47 讲
开篇词 (1讲)
JavaScript 进阶实战课
15
15
1.0x
00:00/00:00
登录|注册

12|JS语义分析该用迭代还是递归?

你好,我是石川。
在前面两讲中,我们学习了 JavaScript 语言的数据类型,通过堆栈的数据结构了解了闭包的原理。这一讲,我们来聊聊算法。前面我们在讲到编程模式时提到,如果说函数式编程是输入、计算和输出,那中间的计算部分就可能用到算法了。而迭代和递归可以说是非常基础的算法。
迭代相对比较好理解,只要用过 for loop 的话,你对它就不会太陌生,而递归比较难理解。但和闭包一样,一旦你掌握了它的运用技巧,就会体会到它的强大之处。
我们在讲到函数式编程的时候,也说过一个很重要的思想就是“副作用”,而递归就自带很多副作用,相应地也出现了很多的解决方案。今天,我们就来看看它都有哪些副作用,以及解决这些副作用我们可以用哪些方法。
那在这之前,我们先来看看迭代和递归分别是什么。

迭代和递归的区别

首先我们得搞清楚迭代和递归有什么区别?
先说迭代,举个例子。做过软件工程的同学都经历过迭代吧,如果是一个敏捷的项目,它的过程就是一个小步快跑的过程,功能不是一下子都做出来的,而是根据优先级,先做优先级高的,再做优先级低的。这就是一个通过循环往复不断完善的过程。
而递归呢,就好比我们寄快递。寄出去的过程是递,收到签收的回执就是归,但是这个过程中间可不只一个人,而是在寄出去的过程,是一个人先运到中转站,再有人运到联络处,最后才到我们手中。哪怕回去的回执是电子的,但在网络世界里,信息的传递也是需要经过每个节点。这样的一去一回就是递归。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

JavaScript中的迭代和递归是基础的算法思想。迭代通过循环不断完善过程,而递归则是通过函数自身的调用来解决问题。本文通过阶乘和斐波那契数列的计算展示了迭代和递归的应用。同时,介绍了递归中的分治思想和记忆函数的应用,以及尾递归和内存管理的重要性。递归虽然简便,但可能会占用大量栈空间,需要注意内存管理和栈溢出的问题。文章深入浅出地介绍了迭代和递归的区别、应用和优化方法,对于想深入了解JavaScript算法的读者具有很高的参考价值。此外,文章还介绍了递归复杂度计算的方法,包括主定理、递推公式和递归树。在总结中,强调了迭代和递归的优劣势,以及在实际应用中如何选择合适的方法。整体而言,本文为读者提供了全面的迭代和递归算法知识,并引发了对尾递归调用优化的思考。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《JavaScript 进阶实战课》
新⼈⾸单¥59
立即购买
登录 后留言

全部留言(2)

  • 最新
  • 精选
  • 卡卡
    尾调用由于是函数的最后一步操作,所以不需要保留外层函数的调用记录,因为调用位置、内部变量等信息都不会再用到了,只要直接用内层函数的调用记录,取代外层函数的调用记录就可以了。对于尾递归来说,由于只存在一个调用记录,所以永远不会发生"栈溢出"错误。

    作者回复: 很好的说明

    2022-10-18归属地:北京
    7
  • 穷精致
    您好,我这边对尾调用代码进行debugger,在浏览器sourcemap的调用堆栈里,还是会保留外层函数的调用记录的,所以尾调用优化是什么呢?如何知道浏览器是不是开启了尾调用优化呢
    2023-02-03归属地:北京
    1
收起评论
显示
设置
留言
2
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部