广告
返回顶部
首页 > 资讯 > 前端开发 > VUE >如何提升JavaScript递归效率
  • 494
分享到

如何提升JavaScript递归效率

2024-04-02 19:04:59 494人浏览 泡泡鱼
摘要

这篇文章将为大家详细讲解有关如何提升javascript递归效率,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。递归是拖慢脚本运行速度的大敌之一。太多的递归会让浏览器变得越

这篇文章将为大家详细讲解有关如何提升javascript递归效率,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。

递归是拖慢脚本运行速度的大敌之一。太多的递归会让浏览器变得越来越慢直到死掉或者莫名其妙的突然自动退出,所以我们一定要解决在JavaScript中出现的这一系列性能问题。

我们可以通过memoization技术来替代函数中太多的递归调用。memoization是一种可以缓存之前运算结果的技术,这样我们就不需要重新计算那些已经计算过的结果。

对于通过递归来进行计算的函数,memoization简直是太有用了。我现在使用的memoizer是由Crockford写的,主要应用在那些返回整数的递归运算中。当然并不是所有的递归函数都返回整数,所以我们需要一个更加通用的memoizer()函数来处理更多类型的递归函数。

function memoizer(fundamental, cache) {     cachecache = cache || {};     var shell = function(arg) {         if (! (arg in cache)) {             cache[arg] = fundamental(shell, arg);         }         return cache[arg];     };     return shell;   }

这个版本的函数和Crockford写的版本有一点点不同。首先,参数的顺序被颠倒了,原有函数被设置为***个参数,第二个参数是缓存对象,为可选参数,因为并不是所有的递归函数都包含初始信息。在函数内部,我将缓存对象的类型从数组转换为对象,这样这个版本就可以适应那些不是返回整数的递归函数。在shell函数里,我使用了in操作符来判断参数是否已经包含在缓存里。这种写法比测试类型不是undefined更加安全,因为undefined是一个有效的返回值。我们还是用之前提到的斐波纳契数列来做说明:

var fibonacci = memoizer(function(recur, n) {     return recur(n - 1) + recur(n - 2);   }, { "0": 0, "1": 1} );

同样的,执行fibonacci(40)这个函数,只会对原有的函数调用40次,而不是夸张的331,160,280次。memoization对于那些有着严格定义的结果集的递归算法来说,简直是棒极了。然而,确实还有很多递归算法不适合使用memoization方法来进行优化

有的观点认为,任何使用递归的情况,如果有需要,都可以使用迭代来代替。实际上,递归和迭代经常会被作为互相弥补的方法,尤其是在另外一种 出问题的情况下。将递归算法转换为迭代算法的技术,也是和开发语言无关的。这对JavaScript来说是很重要的,因为很多东西在执行环境中是受到限制的。让我们回顾一个典型的递归算法,比如说归并排序,在JavaScript中实现这个算法需要下面的代码:

function merge(left, right) {     var result = [];     while (left.length > 0 && right.length > 0) {         if (left[0] < right[0]) {             result.push(left.shift());         } else {             result.push(right.shift());         }     }     return result.concat(left).concat(right);   }   //采用递归实现的归并排序算法   function mergeSort(items) {     if (items.length == 1) {         return items;     }     var middle = Math.floor(items.length / 2),     left = items.slice(0, middle),     right = items.slice(middle);     return merge(mergeSort(left), mergeSort(right));   }

调用mergeSort()函数处理一个数组,就可以返回经过排序的数组。注意每次调用mergeSort()函数,都会有两次递归调用。这个算法不可以使用memoization来进行优化,因为每个结果都只计算并使用一次,就算缓冲了结果也没有什么用。如果你使用mergeSort()函数来处理一个包含100个元素的数组,总共会有199次调用。1000个元素的数组将会执行1999次调用。在这种情况下,我们的解决方案是将递归算法转换为迭代算法,也就是说要引入一些循环:

// 采用迭代实现的归并排序算法   function mergeSort(items) {     if (items.length == 1) {         return items;     }     var work = [];     for (var i = 0,     len = items.length; i < len; i++) {         work.push([items[i]]);     }     work.push([]); //in case of odd number of items     for (var lim = len; lim > 1; lim = (lim + 1) / 2) {         for (var j = 0,         k = 0; k < lim; j++, k += 2) {             work[j] = merge(work[k], work[k + 1]);         }         work[j] = []; //in case of odd number of items     }     return work[0];   }

这个归并排序算法实现使用了一系列循环来代替递归进行排序。由于归并排序首先要将数组拆分成若干只有一个元素的数组,这个方法更加明确的执行了这个操作,而不是通过递归函数隐晦的完成。work数组被初始化为包含一堆只有一个元素数组的数组。

在循环中每次会合并两个数组,并将合并后的结果放回work数组中。当函数执行完成后,排序的结果会通过work数组中的***个元素返回。在这个归并排序的实现中,没有使用任何递归,同样也实现了这个算法。

关于“如何提升JavaScript递归效率”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,使各位可以学到更多知识,如果觉得文章不错,请把它分享出去让更多的人看到。

--结束END--

本文标题: 如何提升JavaScript递归效率

本文链接: https://www.lsjlt.com/news/85469.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 如何提升JavaScript递归效率
    这篇文章将为大家详细讲解有关如何提升JavaScript递归效率,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。递归是拖慢脚本运行速度的大敌之一。太多的递归会让浏览器变得越...
    99+
    2022-10-19
  • pandas如何提升计算效率
    这篇文章给大家分享的是有关pandas如何提升计算效率的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。前言Pandas是为一次性处理整个行或列的矢量化操作而设计的,循环遍历每个单元格、行或列并不是它的设计用途。所以...
    99+
    2023-06-15
  • 如何提升MYSQL查询效率
    这篇文章主要介绍了如何提升MYSQL查询效率,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。MySQL数据库执行效率对程序的执行速度有很大的影...
    99+
    2022-10-18
  • JavaScript如何实现递归
    这篇文章主要介绍JavaScript如何实现递归,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!一、什么是递归?如果一个函数在内部可以调用其本身,那么这个函数就是递归函数。简单理解:函数内部自己调用自己, 这个函数就是...
    99+
    2023-06-21
  • 如何提升Vista SP2搜索效率
    今天就跟大家聊聊有关如何提升Vista SP2搜索效率,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。相信很多朋友都已经用上了Windows Vista,它的搜索功能极为强大,除了可以...
    99+
    2023-06-14
  • 如何提升SQLServer Delete数据的效率
    场景: 对一张3亿的大表进行Delete。 通过中间表实现。 先把需要归档的数据写入历史表Cou_History..Cou_History。 把需要删除表的字段条件写入中间表。 select S...
    99+
    2022-10-18
  • 如何利用node提升工作效率
    这篇文章主要为大家展示了“如何利用node提升工作效率”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“如何利用node提升工作效率”这篇文章吧。在工作项目中需要依...
    99+
    2022-10-19
  • mysql如何提升跨表查询效率
    mysql使用索引提升跨表的查询效率索引是帮助mysql高效获取数据的数据结构。其原理是通过不断的缩小想要获得数据的范围来筛选出最终想要的结果,同时把随机的事件变成顺序的事件,也就是我们总是通过同一种查找方式来锁定数据。mysql中如果没有...
    99+
    2022-10-20
  • 如何提升香港服务器效率
    提升香港服务器效率的方法:1、通过在线实时的匹配实际负荷容量,提升香港服务器工作效率;2、整合香港服务器的所有资源,将服务器进行虚拟化;3、利用更多的节能设备,来降低香港服务器的功率消耗。匹配服务器容量与实际负荷即使是最好的虚拟化和最新刷新...
    99+
    2022-10-06
  • 提升效率的JavaScript简写技巧有哪些
    这篇文章主要讲解了“提升效率的JavaScript简写技巧有哪些”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“提升效率的JavaScript简写技巧有哪些”...
    99+
    2022-10-19
  • 如何提高JavaScript执行效率
    这篇文章将为大家详细讲解有关如何提高JavaScript执行效率,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。文中所提供的代码片段都已经过最新版的Chrome 30测试,...
    99+
    2022-10-19
  • javascript可以提升效率的chrome技巧有哪些
    这篇“javascript可以提升效率的chrome技巧有哪些”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“javascri...
    99+
    2023-07-02
  • 如何利用Linux+NPM提升PHP开发效率?
    随着互联网的快速发展,PHP已经成为了最受欢迎的Web编程语言之一。无论是开发一个简单的网站还是复杂的Web应用程序,PHP都是一个不可或缺的工具。然而,PHP的开发效率并不总是很高,这也是很多开发者所面临的一个问题。Linux NPM是一...
    99+
    2023-10-11
    开发技术 linux npm
  • 如何提升美国服务器运用效率
    提升美国服务器运用效率的方法有:1、将美国服务器进行虚拟化操作,从而节省空间来提升服务器运用效率;2、灵活运用管理工具来提升美国服务器管理效率;3、升级美国服务器的配置,使运用美国服务器效率更好。具体内容如下:虚拟化美国服务器假如您不愿项目...
    99+
    2022-10-20
  • 如何提升香港服务器运用效率
    提升香港服务器运用效率的方法:1、将香港服务器进行虚拟化,降低开支并节省空间;2、采用DCIM管理工具来提升香港服务器管理效率;3、及时更新香港服务器的配置提高服务器工作效率。具体内容如下:虚拟化假如你目前只想充分利用你所拥有的香港服务器空...
    99+
    2022-10-07
  • 美国服务器如何提升工作效率
    美国服务器提升工作效率的方法:1、将美国服务器进行虚拟化,从而充分利用美国服务器配置资源;2、运用管理工具来管理操控美国服务器,从而使机房维护人员高效排查服务器问题并及时解决;3、投资最新技术,升级美国服务器的配置,从而提高服务器整体性能效...
    99+
    2022-10-02
  • VSCode中如何用snippets来提升开发效率
    小编今天带大家了解VSCode中如何用snippets来提升开发效率,文中知识点介绍的非常详细。觉得有帮助的朋友可以跟着小编一起浏览文章的内容,希望能够帮助更多想解决这个问题的朋友找到问题的答案,下面跟着小编一起深入学习“VSCode中如何...
    99+
    2023-06-26
  • 如何理解JavaScript中的递归函数
    今天就跟大家聊聊有关如何理解JavaScript中的递归函数,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。什么是递归函数在编程世界里面,递归就是一个...
    99+
    2022-10-19
  • 如何应用Golang Facade模式提升开发效率
    在Go语言中,Facade模式可以被用来提升开发效率,特别是在处理复杂系统或子系统的情况下。Facade模式通过提供一个简单的接口,...
    99+
    2023-10-08
    Golang
  • 如何利用 Python IDE 接口提升编程效率?
    如何利用 Python IDE 接口提升编程效率? Python 是一种广泛应用的编程语言,因其简单易学、可扩展性强、拥有强大的库支持等特点而备受开发者的欢迎。而 Python 的 IDE(集成开发环境)也是开发者必不可少的工具之一。Pyt...
    99+
    2023-08-03
    面试 ide 接口
软考高级职称资格查询
推荐阅读
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作