ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 效率神器,一键搞定繁琐工作
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
让更多数据处理,一键完成 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
楼主: shaowu459

[原创] LAMBDA函数:递归基础

[复制链接]

TA的精华主题

TA的得分主题

 楼主| 发表于 2022-12-7 10:25 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
本帖已被收录到知识树中,索引项:LAMBDA

确实是,好像好多语言里都有lambda这个函数,还有reduce

TA的精华主题

TA的得分主题

 楼主| 发表于 2023-9-25 08:41 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
关于递归出现错误的调试方法:
递归公式一般逻辑很简单,在满足条件的情况下终止返回某值,否则调整参数后调用自身进入下一次循环。在这种情况下,一般出现了错误是比较难以排查的。下面介绍两种可能得调试和处理方法,以fx=lambda(x,y,if(终止条件,终止返回值,fx(x',y')))为例(简化了结构,实际可能会有REDUCE函数堆积的过程,这样才能显示中间值出来):

方法一:添加计数器
fx中添加一个新参数,用于计数,例如在公式中添加z这个参数,每次调用的时候z值+1:
fx=lambda(x,y,z,if(终止条件,终止返回值,fx(x',y',z+1)))
如果原来的递归过程中出错,上面的公式还会出错,但是可以使用IFERROR函数判断再次调用的fx出错时,返回z的值,这样就知道是第几次递归调用时出错。还有一个应用,就是假如设定递归100次后还没有结果,就让返回“超时,无结果”这种,可以用z作为退出条件,也就是达到一定次数就终止递归。

方法二:输出出错时的x或y值,或者关于x或y的统计值、字符串

假设fx公式不变,仍为以下公式:
fx=lambda(x,y,if(终止条件,终止返回值,fx(x',y')))
循环时x和y可能是单值也可能是数组,可能是数字也可能是其他值。可以使用IFERROR函数返回当递归调用fx出错时的值,例如返回x或y本身,或者CONCAT(x)或CONCAT(y),也可能是COUNT函数返回x或y的数字个数,也可能是其他字符串,类似:"出错时x中元素的数量是"&COUNTA(x)之类的,用于辅助判断。

评分

1

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2024-1-2 14:27 | 显示全部楼层
关于递归函数的使用提示:

在工作表函数公式中使用递归方法,不一定使用递归的本意,也即不一定使用一层一层往下迭代这个用法。例如,在使用REDUCE函数解决问题时,可能要用到原始数组,同时在循环过程中要对原始数组进行提取、运算后形成新的结果数组,并且原数组可能要再剔除或增加某些行以便进行下次运算。在这种情况下,既需要原始数组又需要结果数组,如果堆叠起来在后续运算时再拆分合并就比较麻烦了。这时,可以用递归来代替这种循环,在递归函数fx里设置不同的参数,不同的参数在每次循环时各自可以进行维护和修改,包括增删行、增减字符串长度、横纵向堆叠、增加或减少计数等等,每个参数都可以是不同维度、不同类型的,各自运算和维护。这种方法能实现编程时使用的各种临时数组、原始数组、结果数组、计数器、字符串、中间结果等等的维护和运算。


例如,fx可以写成类似下面的形式:
fx(原数组array,计数器n,结果数组res,结果字符串res,中间m*n的数组1,中间m*n的数组2,中间判定字符串str,中间变量1,中间变量2,状态值1,状态值2,累计求和值……)


上面的递归公式运算时,每次都可以对原数组array进行运算和更新(每次循环后array可能都会发生变化),满足条件就更新结果数组或字符串的值。这样,只要设定好退出条件,例如计数器n达到了原字符串的长度,或者array仅剩余1行,或者结果字符串长度达到原字符串长度等等,就可以方便的利用fx中存储的各种信息来进行运算和返回值。

TA的精华主题

TA的得分主题

发表于 2024-1-23 21:17 | 显示全部楼层
学习递归用Lambda函数

TA的精华主题

TA的得分主题

 楼主| 发表于 2024-3-14 13:08 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
群里朋友分享的在excel单元格公式中直接使用递归的方法,不用定义名称。

在LET中定义fx,其中LAMBDA函数部分参数使用fx作为参数,后面嵌套调用。例如求1-100的合计:
  1. =LET(fx,LAMBDA(fx,n,IF(n=1,1,n+fx(fx,n-1))),fx(fx,100))
复制代码
图片.png

评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2024-5-5 00:28 来自手机 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
ifs多条件判断,当公式有递归时,大概率会发生错误,害我纠结了好久,原来超人老师早就知道了

TA的精华主题

TA的得分主题

发表于 2024-5-5 08:39 | 显示全部楼层
学习了,谢谢老师分享

TA的精华主题

TA的得分主题

发表于 2024-5-5 10:16 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
一看就会,我一学就废!!!!!!!!!!  递归,是我永远的痛。现在看到这种复杂 的,要用递归解决的问题,直接放弃。。。


------------- Excel 递归 。。 从入门到放弃。。。。。

TA的精华主题

TA的得分主题

 楼主| 发表于 2024-5-7 11:52 | 显示全部楼层
递归小例题:
  1. =LET(fx,LAMBDA(fx,n,IF(n=1,1,VSTACK(n,n&"+"&fx(fx,n-1)&"+"&n,n))),fx(fx,10))
复制代码
图片.jpg

循环也大概写了一个,供参考:

  1. =MAP(ROW(1:19),LAMBDA(x,LET(s,SEQUENCE(IF(x>10,20-x,x),,10,-1),TEXTJOIN("+",,s,IFERROR(DROP(SORTBY(s,s),1),"")))))
复制代码
图片.jpg




TA的精华主题

TA的得分主题

发表于 2024-5-7 17:54 来自手机 | 显示全部楼层
shaowu459 发表于 2024-3-14 13:08
群里朋友分享的在excel单元格公式中直接使用递归的方法,不用定义名称。

在LET中定义fx,其中LAMBDA函数 ...

有一点不解,这个递归只能递归到4095,数值再大1结果就会是#NUM!,是什么原因限制了递归计算的次数呢
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

手机版|关于我们|联系我们|ExcelHome

GMT+8, 2024-11-16 09:00 , Processed in 0.039440 second(s), 10 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

沪公网安备 31011702000001号 沪ICP备11019229号-2

本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:李志群律师

快速回复 返回顶部 返回列表