递归之一(Excel函数集团)
递归,这名词出现在了Excel函数集团,是的,你没看错!
但递归在工作表函数里,也不是无限制的用,而是有以下条件:
- 需要Lambda出马
- 需要一个开关
- 需要自定义名称
先祭一个最简单的例子,定义一个名称,其参数是几,结果就是几。
- x是Lambda自定义的参数,也是Fx的参数
- x是数值
- 开关可以用If来判断,当x大于0的时候生效
- 自定义的名称是Fx
Fx=LAMBDA(x,IF(x,Fx(x-1)+1))
然后,就这个样子了:
在这个公式里,Fx(x-1)表示的是Fx(x)“前一个值”。比如x为3时,它的前一个值就是2,在前一个值的基础上加1,就是3,也就是整个公式最终的结果。
先减1再加1,是不是有点多余呢?事实上是,一点都不多余,因为公式如果直接写成Fx(x),那么x为3是,无论运算多少次还是3,永远不会触碰到开关,那样就进入死循环了。
好吧,就算先减1再加1没毛病,但这个公式本身,怎么看怎么觉得多余,那就换个不那么多余的:
1+1/2+2/3+3/4+...+(x-1)/x
Fx=LAMBDA(x,IF(x,Fx(x-1)+(x-1)/x,1))
公式中的“(x-1)/x”部分照抄,前面的部分就是Fx(x)的上一个值,也就是Fx(x-1),因为公式是从1起始的,所以这里的If第三个参数要写成1。