美文网首页
解读JS递归栈优化代码

解读JS递归栈优化代码

作者: 轮回_1174 | 来源:发表于2017-04-01 20:56 被阅读0次

代码如下

function tco(f) {
  var value;
  var active = false;
  var accumulated = [];

  return function accumulator() {
    accumulated.push(arguments);
    if (!active) {
      active = true;
      while (accumulated.length) {
        value = f.apply(this, accumulated.shift());
      }
      active = false;
      return value;
    }
  };
}
var sum = tco(function ff(x, y) {
  if (y > 0) {
    return sum(x + 1, y - 1)
  }
  else {
    return x
  }
});

sum(1, 100000)
// 100001

上面的代码的执行栈图


首先来说下变量valueactiveaccumulated的作用
value:保存最终递归结果,在递归期间一直是undefined
accumulated:用来结束while循环。
active:栈帧释放判断条件。

我在学习这段代码时,有一个疑惑,while循环执行一次后就会因不满足条件而退出循环,那么可不可以用if代替呢?答案是否。因为while会一直循环而不是只执行一次,虽然 accumulator函数代码看起来是这样的。其原因是 第二个accumulator帧在执行accumulated.push(arguments);时使accumulated.length为真,当会返回到第一个accumulator帧时就会因满足条件而继续循环。最后当执行到return x时就不会再创建第二个accumulator帧,ff返回出栈,第一个accumulator因不满足条件而退出循环返回递归结果value出栈,整个递归过程就结束了。

相关文章

  • 解读JS递归栈优化代码

    代码如下 上面的代码的执行栈图 首先来说下变量value、active、accumulated的作用value:保...

  • 9. 递归函数

    使用递归函数需要注意防止栈溢出解决递归调用栈溢出的方法是通过尾递归优化遗憾的是,大多数编程语言没有针对尾递归做优化...

  • 尾递归优化

    “尾递归优化”的含义是:如果递归函数属于尾递归,那么运行时会优化其调用过程。优化主要针对调用栈,将多层调用,转化为...

  • 1

    #函数 ##递归函数容易,栈溢出,这个时候可以用*尾递归*优化,尾递归的意思就是说在递归函数末尾引用本函数的时候,...

  • 算法图解学习(三)

    递归: 关于递归经典的例子就是斐波那契数 具体的python代码如下: 栈: 队列:

  • 二叉树

    结构体 创建二叉树 递归遍历 栈操作 非递归遍历 层次遍历 完整代码

  • 2018-01-26 js尾调用

    1.在js中使用递归的时候,有可能会栈溢出,因为浏览器调用栈有上限限制,具体可以用以下代码测出当前浏览器所能用的最...

  • 二叉树先序,中序和后序遍历的递归和非递归实现

    递归 比较简单,直接看代码即可. 非递归 先序遍历 申请一个栈,记为s1,将头结点压栈. 每次从栈顶弹出节点nod...

  • js递归,尾递归优化

    一开始阶层递归,每次递归可以获取值 优化: 使用尾递归,最后一次递归才返回所需要的值 查考文章: http://w...

  • Python学习之路(递归函数)

    函数之 递归函数 小结 使用递归函数的优点是逻辑简单清晰,缺点是过深的调用会导致栈溢出。针对尾递归优化的语言可以通...

网友评论

      本文标题:解读JS递归栈优化代码

      本文链接:https://www.haomeiwen.com/subject/qdjiottx.html