ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 Excel Home精品图文教程库
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
300集Office 2010微视频教程 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
12
返回列表 发新帖
楼主: shaowu459

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

[复制链接]

TA的精华主题

TA的得分主题

 楼主| 发表于 2022-12-7 10:25 | 显示全部楼层
本帖已被收录到知识树中,索引项:LAMBDA

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

TA的精华主题

TA的得分主题

 楼主| 发表于 2023-9-25 08:41 | 显示全部楼层
关于递归出现错误的调试方法:
递归公式一般逻辑很简单,在满足条件的情况下终止返回某值,否则调整参数后调用自身进入下一次循环。在这种情况下,一般出现了错误是比较难以排查的。下面介绍两种可能得调试和处理方法,以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)之类的,用于辅助判断。

TA的精华主题

TA的得分主题

 楼主| 发表于 2024-1-2 14:27 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
关于递归函数的使用提示:

在工作表函数公式中使用递归方法,不一定使用递归的本意,也即不一定使用一层一层往下迭代这个用法。例如,在使用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 | 显示全部楼层

TA的精华主题

TA的得分主题

 楼主| 发表于 2024-3-14 13:08 | 显示全部楼层
群里朋友分享的在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

查看全部评分

您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2024-4-28 15:21 , Processed in 0.029576 second(s), 11 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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