如何用LET+LAMBDA直接写递归公式?
作者:小窝来源:部落窝教育发布时间:2024-06-20 16:07:54点击:928
编按:
小窝曾介绍运用LAMBDA自定义函数重复调用函数自身实现递归运算。那能否不自定义函数而直接写公式实现递归呢?可以!用LET函数直接在公式中定义变量,并在LAMBDA中重复调用变量自身即可实现递归。
问题:是否是递归公式?
一名爱好专研函数的学员提出了两个问题:为何以下公式可以实现分数简化?这是递归公式吗?
=LET(f,LAMBDA(f,x,y,IF(y,f(f,y,MOD(x,y)),B2/x&"/"&C2/x)),f(f,B2,C2))
此处分数的简化也可以用以下更好理解的公式:
=TEXTJOIN("/",,B2:C2/GCD(B2:C2))
说明:
GCD函数比较少用,它是求最大公约数的函数,可以求两个以及多个数的最大公约数。用TEXTJOIN函数以“/”作为分隔符,将B2、C2分别除以最大公约数后的商组合起来得到简化的分数。
LET+LAMBDA递归公式写法
《新函数LAMBDA的用法(下)——递归运算详解》中,利用定义名称自定义函数,并且该函数在自身的LAMDAD公式中被重复调用,实现了递归运算。
求任意两个整数之间序列值的和,如求5到10的和,自定义函数S进行递归运算:
如果不用自定义函数做递归运算,也可直接在编辑栏写公式,用LET函数定义变量并重复调用实现递归。
同样求5到10的和,公式可以写成:
=LET(a,LAMBDA(a,x,y,IF(x=y,x,x+a(a,x+1,y))),a(a,A8,B8))
此处公式中,LET定义了一个变量(名称)a。a等于表达式LAMBDA(a,x,y,IF(x=y,x,x+a(a,x+1,y)))。
递归,必须要实现函数(变量)对自身的循环调用。把自定义S函数公式与a变量表达式进行比较:
可以看出,它们的结构都是一样的,实现了自身的重复调用。
两者的区别在于:
自定义S函数可以直接被自身公式调用,所以LAMBDA只有两个运算变量X和Y,变量循环式S(x+1,y)只交代两个变量的循环方式;
而LET公式中自定的a变量须要作为LAMBDA的一个变量存在才能调用,因此LAMBDA有3个变量a、X、Y,变量循环式a(a,x+1,y)交代3个变量的循环方式。(不了解变量循环式的请一定查看《新函数LAMBDA的用法(下)——递归运算详解》)
如果在LET公式中不把自定的a变量作为LAMBDA变量,而采用自定义函数的方式书写公式,则LAMBDA表达式中的a会被当作不可识别的文本,会出现“#NAME!”错误。
因此,如果用LET+LAMBDA直接写公式做递归运算,相比自定义递归函数,只需把定义的变量作为LAMBDA的一个新增变量即可。
答案
现在来看学员的问题。
公式:
=LET(f,LAMBDA(f,x,y,IF(y,f(f,y,MOD(x,y)),B2/x&"/"&C2/x)),f(f,B2,C2))
这就是一个典型的递归公式。
LET函数自定义变量f既等于整个LAMBDA表达式,同时又是LAMBDA的一个变量;
变量循环式f(f,y,MOD(x,y))调用了自定义变量f,并交代了三个变量的循环方式:f保持不变,x等于y,y等于x除以y的余数;
如果y不等于0,则通过变量循环式f(f,y,MOD(x,y))不断的循环,直到y等于0;
当y等于0,则输出最终结果B2/x&"/"&C2/x;
最后f(f,B2,C2),为表达式f的三个变量赋值并进行运算。
具体的递归运算过程分解如下:
可能部分伙伴会问:为何这样的递归就实现了分数简化?
其实,整个变量的循环取值过程就是用辗转相除法求最大公约数。当Y等于0时,X就是703和1591的最大公约数。
本文配套的练习课件请添加客服微信buluowojiaoyu索取。
做Excel高手,快速提升工作效率,部落窝教育Excel精品好课任你选择!
扫下方二维码关注公众号,可随时随地学习Excel:
相关推荐:
版权申明:
本文作者小窝;部落窝教育享有稿件专有使用权。若需转载请联系部落窝教育。