12|JS语义分析该用迭代还是递归?
石川
你好,我是石川。
在前面两讲中,我们学习了 JavaScript 语言的数据类型,通过堆栈的数据结构了解了闭包的原理。这一讲,我们来聊聊算法。前面我们在讲到编程模式时提到,如果说函数式编程是输入、计算和输出,那中间的计算部分就可能用到算法了。而迭代和递归可以说是非常基础的算法。
迭代相对比较好理解,只要用过 for loop 的话,你对它就不会太陌生,而递归比较难理解。但和闭包一样,一旦你掌握了它的运用技巧,就会体会到它的强大之处。
我们在讲到函数式编程的时候,也说过一个很重要的思想就是“副作用”,而递归就自带很多副作用,相应地也出现了很多的解决方案。今天,我们就来看看它都有哪些副作用,以及解决这些副作用我们可以用哪些方法。
那在这之前,我们先来看看迭代和递归分别是什么。
迭代和递归的区别
首先我们得搞清楚迭代和递归有什么区别?
先说迭代,举个例子。做过软件工程的同学都经历过迭代吧,如果是一个敏捷的项目,它的过程就是一个小步快跑的过程,功能不是一下子都做出来的,而是根据优先级,先做优先级高的,再做优先级低的。这就是一个通过循环往复不断完善的过程。
而递归呢,就好比我们寄快递。寄出去的过程是递,收到签收的回执就是归,但是这个过程中间可不只一个人,而是在寄出去的过程,是一个人先运到中转站,再有人运到联络处,最后才到我们手中。哪怕回去的回执是电子的,但在网络世界里,信息的传递也是需要经过每个节点。这样的一去一回就是递归。
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
- 深入了解
- 翻译
- 解释
- 总结
JavaScript中的迭代和递归是基础的算法思想。迭代通过循环不断完善过程,而递归则是通过函数自身的调用来解决问题。本文通过阶乘和斐波那契数列的计算展示了迭代和递归的应用。同时,介绍了递归中的分治思想和记忆函数的应用,以及尾递归和内存管理的重要性。递归虽然简便,但可能会占用大量栈空间,需要注意内存管理和栈溢出的问题。文章深入浅出地介绍了迭代和递归的区别、应用和优化方法,对于想深入了解JavaScript算法的读者具有很高的参考价值。此外,文章还介绍了递归复杂度计算的方法,包括主定理、递推公式和递归树。在总结中,强调了迭代和递归的优劣势,以及在实际应用中如何选择合适的方法。整体而言,本文为读者提供了全面的迭代和递归算法知识,并引发了对尾递归调用优化的思考。
仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《JavaScript 进阶实战课》,新⼈⾸单¥59
《JavaScript 进阶实战课》,新⼈⾸单¥59
立即购买
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
登录 后留言
全部留言(2)
- 最新
- 精选
- 卡卡尾调用由于是函数的最后一步操作,所以不需要保留外层函数的调用记录,因为调用位置、内部变量等信息都不会再用到了,只要直接用内层函数的调用记录,取代外层函数的调用记录就可以了。对于尾递归来说,由于只存在一个调用记录,所以永远不会发生"栈溢出"错误。
作者回复: 很好的说明
2022-10-18归属地:北京7 - 穷精致您好,我这边对尾调用代码进行debugger,在浏览器sourcemap的调用堆栈里,还是会保留外层函数的调用记录的,所以尾调用优化是什么呢?如何知道浏览器是不是开启了尾调用优化呢2023-02-03归属地:北京1
收起评论