什么是wps中递归函数,如何用let,lambda,take,drop从m个元素中选n个元素的组合?
浅谈出口账务和excel函数 在 WPS 中,递归函数指函数直接或间接调用自身,把复杂问题拆解成同类小问题,直到满足简单边界条件再逐层返回结果。
用 LET + LAMBDA + TAKE + DROP 从 m 个元素中选 n 个元素,核心思路是“逐行判断选不选”:对每行做二选一——要么选中它(再从剩下的 m-1 行里选 n-1 个),要么不选它(再从剩下的 m-1 行里选 n 个)。
IF(ROWS(x)=y,TEXTJOIN(",",,x),
MAP(f(DROP(x,1),y-1), LAMBDA(i,TAKE(x,1)&","&i)),
· LET(f,LAMBDA(x,y,...):给递归函数起名 f,x 是当前候选数组,y 是还需选几个。
· IF(y=1,x):边界条件一。只剩 1 个名额时,直接返回当前所有候选(每个单独成组)。
· IF(ROWS(x)=y,...):边界条件二。候选数量刚好等于还需选的数量时,全选,用 TEXTJOIN 合并为一组。
· 选中当前行:MAP(f(DROP(x,1),y-1), LAMBDA(i,TAKE(x,1)&","&i))。用 TAKE(x,1) 取首行,拼到“剩余行选 y-1 个”的每个结果前。
· 不选当前行:f(DROP(x,1),y)。DROP(x,1) 丢弃首行,在剩余行里继续选 y 个。
· TAKE:从数组开头取指定行/列,这里用于“选中当前首行”。
· DROP:从数组开头删掉指定行/列,这里用于“跳过当前首行,处理剩余行”。
· LET:给长公式里的递归函数起别名,让公式可读、可复用。
WPS 中还有用 REGEXP 拆分字符、TOCOL 过滤的排列写法,适合从单串字符(如 “ABCDEF”)生成排列。如果你需要的是组合(顺序无关),上述“选/不选”递归更直接。