递归优化

国外的技术氛围确实很好:https://www.bilibili.com/video/BV1pg4y167Fw?from=search&seid=9662634805636921187    音乐剧将尾递归优化讲的非常棒!!!awesome!

普通递归时,内存需要记录调用的堆栈所出的深度和位置信息。在最底层计算返回值,再根据记录的信息,跳回上一层计算,再跳回更高一层,依次运行,直到最外层的调用函数。在cpu计算和内存会消耗很多,而且当深度过大时,会出现堆栈溢出。

eg:

function sum(n){
  if(n===1)return 1;
  return n+sum(n-1);
}

然而,尾递归优化却将结果进行了缓存,整个计算过程是线性的,调用依次sum(x,total)后,会进入下一个栈,相关的数据信息和 跟随进入,不再放在堆栈上保存。当计算玩最后的值之后,直接返回到最上层的sum(5,0),这能有效的防止堆栈溢出。在 es6之后,我们将迎来尾递归优化,通过尾递归优化,js在解释成机器码的时候,将会向while看齐,也就是说,同时拥有数学表达能力和while的效能。

eg:

function sum(x, total) {

    if(x===1){
        return x+total;
    }
    return sum(x-1, x+total);
}

猜你喜欢

转载自blog.csdn.net/ChasenZh/article/details/104762222