|
楼主 |
发表于 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)之类的,用于辅助判断。
|
|