JS尾递归的实现方法及代码优化技巧
网络编程 2021-07-04 15:50www.168986.cn编程入门
这篇文章主要介绍了JS尾递归的实现方法及代码优化技巧,结合实例形式分析了尾递归的原理、JS实现方法及优化技巧,需要的朋友可以参考下
本文实例讲述了JS尾递归的实现方法及代码优化技巧。分享给大家供大家参考,具体如下
在学习数据结构和算法的时候,我们都知道所有的递归都是可以优化成栈+循环的。
对于特定的递归函数,一般我们都是手动对它们进行优化的。
在学习scala的时候,接触到尾递归的概念。我们只要将递归写成尾递归方式,编译器会自动帮助我们优化。
ps:并不是所有的递归都可以改写成尾递归
在js中,尾递归通常会被解释器优化。,并不是所有的js解释器都支持尾递归优化。
对于不支持尾递归优化的环境,我们需要手动将递归优化成栈+循环。
这里实现了一个通用的方法,将尾递归优化成栈+循环。
代码摘自阮一峰的《》这本书。
具体代码如下
function tco(f) { var value; var active = false; var aumulated = []; return function aumulator() { aumulated.push(arguments); if(!active) { active = true; while(aumulated.length) { value = f.apply(this, aumulated.shift()); } active = false; return value; } }; } var sum = tco(function(x, y) { if(y > 0) { return sum(x + 1, y - 1); } else { return x; } }); let res = sum(1, 5) console.info(res);
这段代码非常精妙!
分析
已知,任何递归可以写成循环+栈。
实现将任何尾递归转换成循环+栈执行而不需要针对每个尾递归函数写一个实现版本的思路。
困难在于,任何尾递归,通用实现。而不是针对某一个递归函数。
要点
栈中保存的数据,正是递归函数的参数。
通用实现,那就必须依赖原来的递归函数,循环的终止条件,正是递归的结束条件。
要将递归函数的参数入栈,而不修改原来的递归函数,就必须用一个函数代替递归函数被调用,从而取得函数入参。
递归函数的终止条件,每一个递归函数都不一样,如果递归函数没有被调用,说明已达到终止条件。即终止条件和递归函数的调用有关联。而递归函数每次调用,都会将参数入栈。所以可以根据栈中是否有元素,推断是否达到终止条件。
更多关于JavaScript相关内容感兴趣的读者可查看本站专题《》、《》、《》、《》、《》及《》
希望本文所述对大家JavaScript程序设计有所帮助。
上一篇:详解vue-router导航守卫
下一篇:js实现延迟加载的几种方法详解
编程语言
- 甘肃哪有关键词排名优化购买方式有哪些
- 甘肃SEO如何做网站优化
- 河南seo关键词优化怎么做电话营销
- 北京SEO优化如何做QQ群营销
- 来宾百度关键词排名:提升您网站曝光率的关键
- 卢龙关键词优化:提升您网站排名的策略与技巧
- 山东网站优化的注意事项有哪些
- 四川整站优化怎样提升在搜索引擎中的排名
- 疏附整站优化:提升网站性能与用户体验的全新
- 海南seo主要做什么工作售后服务要做到哪些
- 荣昌百度网站优化:提升您网站的搜索引擎排名
- 河北seo网站排名关键词优化如何做SEO
- 江西优化关键词排名推广售后保障一般有哪些
- 古浪SEO优化:提升你的网站可见性
- 西藏网站排名优化怎么把网站排名在百度首页
- 如何提升阳东百度快照排名:详尽指南