和 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);