365最强函数LAMBDA之最强搭档——百变魔术师REDUCE!
拥有函数自定义功能,还能实现复杂的递归计算,LAMBDA功能虽然强劲,但是却有一个致命的软肋!
正如:
=LAMBDA(x,y,x+y)

将会返回结果“#CALC!”,缘由在于函数需要传递参数才能计算。
因此,LAMBDA的出现往往伴随着许多搭档,REDUCE无疑是众多搭档中最为出色的一位!
列如:
=REDUCE(0,{3,5,10},LAMBDA(x,y,x+y))
将会返回结果“18”。

REDUCE的作用就是为LAMBDA函数传递参数,并且按照必定的规则执行计算。
REDUCE一共三个参数:(初始值,数组,函数)
=REDUCE(0,{3,5,10},LAMBDA(x,y,x+y))
公式中:
初始值:0;
数组:{3,5,10};
函数:LAMBDA(x,y,x+y)。
其中,REDUCE初始值对应LAMBDA的第一参数,数组中的每一个值对应第二参数,函数部分为计算表达式。
需要说明的是:LAMBDA的第一二参数是自己定义的,也可以是其他的名称,列如a、b、rr等。
计算原理:
第一步:
初始值为0,即x=0;
传递的数组中的第一个值为3,即y=3;
这时,计算x+y=0+3=3。
第二步:
这时,初始值不再是最初的0,上一步计算的结果3,作为这一步的初始值,即此时x=3;
传递的数组中的第二个值为5,即y=5;
这时,计算x+y=3+5=8。
第三步:
这时,初始值为上一步计算的结果8,作为这一步的初始值,即此时x=8;
传递的数组中的第三个值为10,即y=10;
这时,计算x+y=8+10=18。
至此,REDUCE第二参数数组{3,5,10}传递结束,计算终止,返回最终的结果18。
基于上面的逻辑,下面公式的结果不难想到吧:
=REDUCE(0,{3,5,10,100},LAMBDA(x,y,x+y))

将会传递计算第四次,x+y=18+100=118。
还有一个重大的地方需要特别注意,那就是初始值!
有两种情况,一种是以前面公式中为0或者为其他值,另一种情况是省略。
在省略初始值的情况下,初始值也是存在的,它等于传递数组中的第一个值,并且此时这个值并不执行计算表达式中的计算!
列如:
=REDUCE(0,{3,5,10,100},LAMBDA(x,y,x+y))
=REDUCE(,{3,5,10,100},LAMBDA(x,y,x+y))
由于第一个公式计算过程是0+3+5+10+100,第二个公式计算过程为3+5+10+100,虽然计算过程不同,但是计算结果是一样的。
而下面两个公式结果则不相等:
=REDUCE(0,{3,5,10,100},LAMBDA(x,y,x+y^2))
=REDUCE(,{3,5,10,100},LAMBDA(x,y,x+y^2))

第一个公式的计算过程为0+3^2+5^2+10^2+100^2;
第二个公式的计算过程为3+5^2+10^2+100^2;
区别就在于第2个公式初始值省略,第一个传递的值3并不进行平方计算,直接作为初始值进入下一步的计算。
3^2-3=6,因此两个公式的计算结果相差6。
接下来看一个字符串组合案例:
如下图所示,需要对一些数字重复指定次数,最后组
合成一串文本字符串。

公式一:
=CONCAT(REPT(A2:A7,B2:B7))
解析:
REPT(A2:A7,B2:B7)由于REPT两个参数均支持数组写法,可直接将指定数字批量重复指定的次数,返回的结果再用CONCAT组合起来。
但并不是所有的函数都支持数组写法,或者说有时并不方便进行批量操作,需要一步一步地分步处理。
接下来我们用REDUCE也能解决这个问题。
公式二:
=REDUCE(
“”,
A2:A7,
LAMBDA(X, Y, CONCAT(X, REPT(Y, OFFSET(Y, , 1))))
)
解析:
公式中依然是REPT执行重复数字的操作,REPT(Y,OFFSET(Y,,1))表明将传递的Y值重复指定的次数,次数为Y向右偏移一个单元格位置的值。
第一初始值为””,每传递计算一次,CONCAT将初始值与计算得到的值合并,这样直到传递结束合并完成。







这是我见过的把lambda写的最明白的了,之前看到这个函数总感觉懂了又没懂,这次算是明白了
收藏了,感谢分享