简单分析一下在Excel中使用LAMBDA函数递归的计算逻辑:
让原数组的每个数值都和原数组每个值相加(和值简称数组A),判断是否超过了目标值,如果超过了目标值就舍弃;如果等于目标值就提取出来当最终结果的一部分;如果小于目标值,则将数组A继续与原数组每个值相加,判断是否超过了目标值,如果超过了目标值就舍弃;如果等于目标值就提取出来当最终结果的一部分;如果小于目标值,则再次循环。
从上面的描述可以看出来,只要合计值没有超过目标值,就可以继续循环下去,模式一样,只不过初始值数组会变化,因此该问题可以用递归来解决。
假设递归公式定义为FX,则最终简化概况公式的最终目的是:=VSTACK(等于目标值的组合,FX(小于目标值的组合)),退出条件是超过目标值就退出。
根据上述分析,我们列出递归公式FX:
- =LAMBDA(m,n,o,LET(c,TOROW(n),s,TEXTBEFORE(m,"="),t,TOCOL(s+c),u,t&"="&MAP(TOCOL(TEXTAFTER(m,"=")&"+"&c),LAMBDA(x,TEXTJOIN("+",,SORT(--TEXTSPLIT(x,,"+"))))),v,FILTER(u,t<o,0),VSTACK(UNIQUE(FILTER(u,t=o,0)),IF(@v=0,0,FX(UNIQUE(v),n,o)))))
复制代码 为了方便后续运算,我们给FX三个参数,FX(m,n,o),m是加工后的初始数组(带=),n是初始数组,o是目标值。
定义好之后,假设数据存储在N2:N7单元格区域,则在任意单元格输入以下公式将获得各种方案:
- =LET(s,N2:N7,t,FX(s&"="&s,s,50),FILTER(t,t>0))
复制代码
|