从 Linq Aggregate 到 chrome 控制台的奇葩旅行

 和 Js 的 Reduce 类似,需要注意的是如果提供种子会多迭代一次。

 JS 的 Reduce 可以通过 初始化 数组来提供种子。

 累加器 概念应用广泛,可以通过定义累加器类型来实现 更多功能,这里一定要注意迭代次数。

比如 实现 map

 比如 尾递归 ,累加器 (y)减少了计算次数。

sum 计算 : 5+ sum(4)

       => 4+sum(3) 

              => 3+sum(2)

             => 2+sum(1)

                  => 1

=>2+1=>3+3=>6+4=>10+5 =>15 

sump 计算:sump(4,5) =>sump(3,9) =>sump(2,12) =>sump(1,14) =>sump(0,15) =>15

 sum 可以计算到 11429 ,sump 只能计算到10476 。这是为什么呢???

 

补:昨天睡觉的时候突然想明白了,原因是 sump有两个参数 压入栈的上下文比较大。

验证:

第一组:确实随着参数变多,深度变浅。

 第二组,说明传参变多 深度变浅。

但是这里又有一个新问题,为什么 x=>{...} 要比 ()=>{...} 还要深呢?

 测试代码:

try{ var i =0,loop=(x)=>loop(i++),n=loop(1) }catch {i}  

var sump = (x,y)=>x==0?(y):sump(x-1,y+x);

var sum = x=> x===1?(x):x + sum(x-1);
原文地址:https://www.cnblogs.com/zhuwansu/p/13674142.html