【发布时间】:2020-12-20 20:21:42
【问题描述】:
是否可以通过启用循环引用(在Excel Options 的Formulas 部分中选择enable iterative calculation)在Excel 中创建递归阶乘函数?我当然知道FACT(),我并不是在寻找一种计算阶乘的实用方法。相反,我的目标是找到一种利用循环引用作为在 Excel 中创建和使用递归函数的通用工具的方法,阶乘提供了一个有趣的测试用例。
使用 Jan Karel Pietrerse 的 website 的一个想法,我可以接近,但生成的函数取决于两个单元格而不是一个单元格,因此它不能解决问题。在
我使用顶行中的字符串创建了命名范围。在现在名为 factorial 的单元格中,我输入了:
=IF(initializing,1,IF(factor=0,factorial,factorial*factor))
在单元格factor 中我输入了:
=IF(initializing,n,IF(factor=0,factor,factor-1))
上图显示了n = 10 和initializing = True 时的样子。 factorial 中的公式对应于函数式编程中的标准技巧,通过引入具有累积参数的辅助函数来生成递归函数 tail-call recursive。问题是需要调用辅助函数,而阶乘中的公式在某种意义上既是函数本身也是它的辅助函数,initializing 的内容决定了它当前扮演的角色。
从某种意义上说,如果我将 initializing 的值从 True 切换(例如删除它),那么 factorial 的值将成为正确的阶乘:
initializing可以从图片中去掉吗?是否可以修改设置,例如,如果n 更改为 5 然后 factorial 立即更改为 120 而无需先设置然后更改其他单元格?我尝试了几种不同的方法,但最终还是以 2 步而不是 1 步功能结束。也许是一些涉及数组公式的魔法?
【问题讨论】:
-
当您让公式直接引用自身时,我不明白这是如何工作的。它不是给你一个循环引用错误吗?从概念上讲,说“= 本身”是什么意思?
-
是的,当然是循环引用。在问题的第一句话中,我提到了启用循环引用。 (我只是添加了一个简短的括号来说明如何这样做)。
-
内置函数 FACT() 不够好有什么特别的原因吗?
-
您可以在 VBA 中轻松地做到这一点,但我怀疑在您的工作表中出于此类目的使用循环引用会导致一些不必要的复杂和性能噩梦。
-
@iDevlop 我们的目标是尽可能利用 Excel 进行迭代计算的能力。 Excel 的计算引擎比它的 VBA 解释器更快,所以我的最终目标是找到一种方法将某些递归计算从 VBA 分流到 Excel。这可能不值得,但探索可能性不会有坏处。
标签: excel recursion excel-formula