分享

LAMBDA函数中的递归用法,你用过吗

 hercules028 2022-08-14 发布于四川

递归是一种在循环时不断调用自身的常见编程技巧,如果一个问题可以抽象为不断按照同一个模式运算,则可以考虑使用递归来解决这个问题。

Image

归技巧在各种编程语言中都可以使用,就Excel来说,可以再VBA、Power Query等中直接使用。但在Excel工作表函数中之前是无法实现递归运算的,这种情况直到LAMBDA函数的出现得以改变。

LAMBDA函数是Office 365版本中出现的新函数,这个函数允许用户在工作表操作界面中像VBA那样创建自定义函数,因为自定义函数的存在进而使调用自定义函数自身的递归方法实现成为了可能。

Image

关于LAMBDA函数的详细介绍,可以参考ExcelHome论坛满坛版主的精华帖:

https://club./thread-1570500-1-1.html

在此不做过多说明,本文重点介绍如何使用LAMBDA函数实现递归运算。

在Excel中使用LAMBDA实现递归有两个基本要求:一是使用LAMBDA函数制作的自定义函数必须定义为名称;二是必须为LAMBDA函数定义的自定义函数设置退出条件,因为本质上递归也是循环,如果不设置退出条件循环将无法终止。

下面我们来看两个使用LAMBDA函数递归来解决问题的例子。

示例一:求菲波那契数列第10项的值。

斐波那契数列指的是这样一个数列:1、1、2、3、5、8、13、21、34、……从第3项起,每项的值为其前两项的值合计,例如2=1+1,3=2+1,5=3+2,以此类推。抽象出来的表达式为:F(1)=1,F(2)=1, F(n)=F(n-1)+F(n-2)(n>=3)。可以观察到,每一项都等于前两项的合计,这就是一个固定的运算模式,因此可以使用递归来完成。举例来说,求第5项是多少,图解如下:

Image

从上往下到步骤4的时候,F(2)和F(1)的已经是确定的了,因此F(3)的值也就确定了:F(3)=F(2)+F(1)=1+1=2,

F(3)确定了那么F(4)也就确定了:F(4)=F(3)+F(2)=2+1=3,

F(4)确定了那么F(5)也就确定了:F(5)=F(4)+F(3)=3+2=5。

下面来详细描述一下使用LAMBDA函数递归来解决这个问题的详细步骤。首先,在名称管理器中定一个名称FX,其公式如下:

=LAMBDA(x,IF(x<3,1,FX(x-1)+FX(x-2)))

Image

上述公式的意思是,如果给定项的值小于3,也就是为1或2,公式都将返回1,因为数列第1和第2项值都是1;如果给定项的值大于等于3,则返回这一项编号减去1和减去2的项,也即当前项前1项和前2项的值。以此类推,一直到x小于3时停止循环。

在工作表任意空单元格中输入=FX(10)则返回菲波那切数列第10项的值:

Image

示例二:根据父级ID返回部门全称。

如下图,B列是部门名称,A列是部门的id,C列是部门的父级部门id,要求在D列返回部门的全称。如【南京办】的父级ID是3,也就是【销售部】,【销售部】父级id是1,也就是【营销中心】,因此【南京办】的部门全称是:【营销中心 / 销售部 / 南京办】。

Image

递归解决这个问题的思路是:针对每一个部门,都去查其父级id,如果父级id有数字,就用【查找父级id返回的字符串】&'/'&当前部门名称,直到父级id是空单元格(没有上级id)为止。

以【南京办】这个部门为例,从查找其父级id数字3开始:

Image

最终查找id=1返回【营销中心】,然后再逐层向上返回值。

使用LAMBDA函数实现的具体方式为:单击D列任意单元格(也可以单击任意单元格定义名称,但需将引用的列绝对引用),定义一个名称tx,其公式如下:

=LAMBDA(x,IF(x=0,OFFSET(x,,-1),tx(XLOOKUP(x,A:A,C:C))&' / '&OFFSET(x,,-1)))

Image

该公式的意思是:如果父级id列值是0(空单元格),也就是没有上级部门了,就返回父级id左侧1列的单元(也即部门名称),这是退出循环的条件。如果父级id列值大于0,也就是有上级部门则再次调用tx,其参数为在A列中查找当前的父级id,返回上级部门对应的父级id,继续按上述模式运算,并且将返回值与当前行的部门名称用斜杠连接起来。

C2单元格输入公式:=tx(C2),将公式下拉即可返回每一个部门的全称。

Image

上面就是使用LAMBDA函数实现递归的基本方法,在使用时注意一定要设置退出条件。

留一个思考题,请用递归方法实现将不同列数据的全部组合列示出来,如下图,要求返回款号、部位、颜色、床次、尺码、搭配这几列内容的全部组合。

Image

思考题的源文件在下面的链接之中,链接文件中还包括更多Office 365新函数的使用说明,如REDUCE函数、MAP函数、SCAN函数、TAKE函数、DROP函数、TEXTSPLIT函数等等,

作者:超人Clark

原载:超人一筹高效办公

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多