Excel Lambda函数递归用法咨询:合并唯一发票值问题
解决Excel Lambda递归合并符合条件的唯一发票号问题
问题分析
你当前的l_ar函数仅返回最后两个元素,核心原因是没有实现递归遍历逻辑——你只是直接拼接了数组的最后两行,没有通过递归调用自身来处理剩余元素。Lambda递归的核心是终止条件+迭代缩小问题规模,你的代码缺少了迭代的递归调用环节。
修正后的递归Lambda函数
先保留你已实现的l_uf函数(负责筛选符合条件的唯一发票号),然后重写l_ar为递归版本:
l_uf = LAMBDA(array,criteria, UNIQUE(FILTER(CHOOSECOLS(array,2),CHOOSECOLS(array,1)=criteria,"")) );
l_ar = LAMBDA(array, criteria, LET( v, l_uf(array, criteria), n, COUNTA(v), // 定义内部递归函数,处理数组和当前待合并的长度 recursive_merge, LAMBDA(arr, len, // 终止条件:只剩1个元素时直接返回 IF(len = 1, CHOOSEROWS(arr, 1), // 递归步骤:拼接当前最后一个元素 + 前len-1个元素的递归合并结果 CHOOSEROWS(arr, len) & "-" & recursive_merge(arr, len - 1) ) ), // 处理空数组的情况 IF(n = 0, "", recursive_merge(v, n)) ) );
递归原理拆解
以v = {"INV001", "INV002", "INV003"}为例,递归执行流程:
- 初始调用
recursive_merge(v, 3):取第3个元素INV003,拼接-和recursive_merge(v, 2)的结果 - 调用
recursive_merge(v, 2):取第2个元素INV002,拼接-和recursive_merge(v, 1)的结果 - 调用
recursive_merge(v, 1):触发终止条件,直接返回INV001 - 反向拼接:
INV002-INV001→INV003-INV002-INV001
正序合并调整
如果需要按发票号出现的正序拼接(如INV001-INV002-INV003),只需修改递归步骤的拼接顺序:
recursive_merge, LAMBDA(arr, len, IF(len = 1, CHOOSEROWS(arr, 1), recursive_merge(arr, len - 1) & "-" & CHOOSEROWS(arr, len) ) )
关键知识点
- 终止条件:必须定义递归停止的边界(这里是
len=1),否则会无限循环导致Excel报错 - 迭代缩小规模:每次递归调用时,将问题规模缩小(这里是
len-1),逐步逼近终止条件 - 内部Lambda封装:用
LET定义内部递归函数,避免重复调用l_uf筛选数组,提升效率
内容的提问来源于stack exchange,提问作者Enzo_c
相关产品推荐
相关产品推荐

